我正在解析一个非常繁重的文件夹结构(就文件夹和文件的数量而言)。我必须浏览所有文件夹并解析我遇到的任何文件。文件本身很小(1000-2000个字符,但有些更大)。我有两个选择:
- 浏览所有文件夹和文件并解析我来的任何内容 在一个大的递归循环中。
- 浏览所有文件夹并存储所有文件的路径 我遇到过。在另一个循环中,通过引用解析文件 到存储的文件路径。
醇>
哪个选项会更好,也许更快(速度最有可能是I / O限制,所以最有可能不会产生影响,但我想我还是会问)?
答案 0 :(得分:7)
“最易读,最容易理解的”几乎总是意味着“最简单,最简单的方式。”(虽然有些代码本质上很复杂。但这仍然不是编写不可读代码的借口。)在我看来,选项1听起来更容易实现,但请亲自尝试。瓶颈的概况如果不够快。
最有可能的是,实际的磁盘I / O将比任一选项所需的总处理器周期或内存访问时间多更长,因此您选择的选项可能甚至不相关。但是,确定程序运行速度以及是否需要改进的唯一方法是分析。
答案 1 :(得分:2)
如何创建要处理的文件名列表的一个线程,以及读取该文件列表并使用少数工作线程之一进行处理的另一个线程?
我不知道有多少目录,但只是猜测这不是最重要的时间。我会说你通过拥有一个线程池来获得最佳性能,池中的每个线程都会解析一个文件(一旦你有了它们的列表。)因为那些东西会被IO绑定,所以线程可能会使事情效率更高。
答案 2 :(得分:0)
选项似乎功能相同。我会说,考虑应该是可读性和可维护性 - 更容易理解,以后需要时更改,扩展或修复错误。
将功能分解为单独的对象也值得考虑 - 一个是执行搜索,另一个是解析找到的文件。然后,您可以同时运行它们并实现更好的CPU利用率。
答案 3 :(得分:0)
这在很大程度上取决于文件夹结构的深度以及您在内存中需要保留多少数据(包括文件/文件名的数量)。
如果你有一个非常深的结构,你可能会遇到堆栈溢出。但是,由于路径长度限制,它不太可能。您必须将所有文件名存储在内存中,这可能会很麻烦,但可能实际上不会成为问题。
假设这些函数很简单,那么简单地为每个找到的目录调用递归搜索函数和为每个有效文件调用文件解析器可能更容易,所有这些都在一个循环中完成:
function search_folder:
for each item in curdir:
if item is file:
parse_file(item)
else if item is folder:
search_folder(item)
这为您提供了一个相对简单且易读的结构,代价是潜在的深度递归。缓存文件名并在以后通过它们涉及更多代码并且可能不太可读,并且(假设您以相同方式处理目录)将具有相同的递归量。
我选择#1,因为它看起来更灵活,更优雅。