【问题标题】:Too large hierarchy tree using Recursion , makes file searching to crash使用 Recursion 的层次结构树太大,导致文件搜索崩溃
【发布时间】:2012-06-19 13:59:45
【问题描述】:

我编写了一个用于搜索特定文件的代码,用户在其中输入起始路径和文件名,如果文件存在则程序打印其详细信息,否则打印未找到。

正如我所怀疑的那样,当层次结构树太大时,递归的使用会使代码崩溃,我尝试了 400 个目录但它失败了,所以我猜想在50 文件夹一个内到另一个之后,递归的开销使代码崩溃。

有什么建议可以解决这个问题吗?基本上代码对于低级树层次结构是可以的,但我需要为健康的树设计它(500-600 个文件夹一个在另一个文件夹中,一个文件存储在最后一个文件夹中),谢谢

【问题讨论】:

    标签: c linux file ubuntu recursion


    【解决方案1】:

    最脏的方法是increase stack size

    第二种是将char full_name[_POSIX_PATH_MAX + 1]替换为char *fullname=malloc((_POSIX_PATH_MAX + 1)*sizeof(char)),递归调用后不要忘记free()

    也许最好的办法是废弃该代码并使用强大的无所不在的find

    【讨论】:

    • 我不能使用find,我的任务是写一个模拟find的代码:)
    • 我试过这样做char *fullname=malloc((_POSIX_PATH_MAX + 1)*sizeof(char)),但还是一样。
    • 感谢您的建议,但我尝试将两者都增加到 16MBchar *fullname=malloc((_POSIX_PATH_MAX + 1)*sizeof(char)) ,但它仍然不适用于 100 或 500 个文件夹。
    • 抱歉,这些建议都不起作用。不过还是谢谢你。
    • 切线,sizeof(char) 不是绝对必要的,因为 C 标准规定 sizeof(char) == 1 始终。
    【解决方案2】:

    您可以删除递归(即转换为迭代解决方案),方法是存储您看到的目录(而不是立即处理它们),然后在稍后的迭代中返回它们。但是,您可能不会得到完全相同的输出(事情的顺序可能不同)。

    此方法的工作方式是拥有一个要处理的目录列表,然后您浏览此列表(随时添加任何子目录)。

    在伪代码/Python 中:

    def print_dirs(path, recursive, filename):
       dir_stack = empty stack
       dir_stack.push(path)
    
       while dir_stack is not empty:
          dir = dir_stack.pop() # returns the head element (and removes it)
    
          for file in children(dir):
    
             # ...do stuff with names...
    
             if recursive and file is a directory:
                 dir_stack.push(file) # process the directory later
    

    堆栈可以很容易地实现为单链表。请注意,如果path 不是目录,则需要进行特殊处理,并且此不是递归的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多