Python 遍历目录结构与读取包含ls(或类似命令)内容的文件以执行搜索的性能

Python 遍历目录结构与读取包含ls(或类似命令)内容的文件以执行搜索的性能,python,Python,在执行多个搜索时,遍历目录结构更好吗?还是对目录结构(在文件或内存中)进行编目,然后对该目录进行操作是一个好主意?还是有其他更适合我的方法,我没有想到 我有一个3.5TB的外置硬盘,有数千个文件。 我有一组列出目录内容的文件。这些列表文件包含文件夹名称、文件名和文件大小。 我想在外部硬盘上搜索这些列表文件中的文件。如果找到一个文件,那么我想检查一下,看看实际文件的文件大小是否与列表文件中的文件大小匹配 这个过程将涉及大约1000个列表文件,可能涉及1000个实际文件中的10个 清单文件的内容如下

在执行多个搜索时,遍历目录结构更好吗?还是对目录结构(在文件或内存中)进行编目,然后对该目录进行操作是一个好主意?还是有其他更适合我的方法,我没有想到

我有一个3.5TB的外置硬盘,有数千个文件。 我有一组列出目录内容的文件。这些列表文件包含文件夹名称、文件名和文件大小。 我想在外部硬盘上搜索这些列表文件中的文件。如果找到一个文件,那么我想检查一下,看看实际文件的文件大小是否与列表文件中的文件大小匹配

这个过程将涉及大约1000个列表文件,可能涉及1000个实际文件中的10个

清单文件的内容如下

folder: SummerPhotos
name: IMG0096.jpg, length: 6589
name: IMG0097.jpg, length: 6489
name: IMG0098.jpg, length: 6500
name: IMG0099.jpg, length: 6589
name: BeachPhotos/IMG0100.jpg, length, 34892
name: BeachPhotos/IMG0101.jpg, length, 34896
我喜欢使用列出外部硬盘内容的文件脱机处理列表文件,因为这样我可以在速度更快的计算机上执行此操作(因为硬盘驱动器位于充当服务器的旧计算机上),或者在多台计算机上拆分列表文件并拆分工作。另外,我认为不断地遍历目录结构是非常低效的,并且会对硬件造成不必要的磨损

行走伪代码:

 for each listing file
      get base_foldername,filelist
 for root,subfolder,files in os.walk(/path/to/3.5TBdrive)
      if base_foldername in subfolder
              for file in filelist
                  if file in files
                      if file.size == os.path.getsize(file)
                          dosomething
                      else
                          somethingelse
                  else
                      not_found
对于catalog file方法,我考虑将递归的“ls”转储到文件中,然后对该文件进行字符串搜索。我将提取文件大小并在那里执行匹配

我的“ls-RlQ”转储文件大小为11MB,约150k行。如果有更好的方法获取所需数据,我愿意接受建议。我正在考虑使用os.walk()编译一个列表,并以我喜欢的格式创建我自己的文件,同时尝试解析我的ls命令

我觉得我应该做一些事情让我的大学教授感到自豪,并制作一个哈希表或平衡树,但我觉得实现这一点所需的时间比简单地强制解决方案占用cpu周期要长

操作系统:Linux

首选编程语言:Python 2/3

谢谢

在执行多个任务时,是否最好遍历目录结构 搜索还是将目录结构编目(在 然后对该目录进行操作

如果您只想检查文件是否存在或者目录结构是否太复杂,我建议您只使用文件系统。你基本上是在重复它已经做过的工作,这将导致未来的问题,就像复杂性总是这样

我不认为在程序内数据结构中使用哈希表或平衡树有任何意义——这也是您的文件系统已经在做的事情。要加快查找速度,您应该做的是设计一个深层目录结构,而不是几个包含数千个文件的单一目录。有些文件系统在试图列出包含数万个文件的目录时会阻塞,最好将自己的目录限制在几千个,如果超过了,则创建一个新的目录深度级别

例如,如果要保留internet范围内扫描研究的日志,如果要为扫描的每个主机使用单个文件,则不希望创建目录
扫描日志
,其中包含
1.1.1.1.xml
1.1.1.2.xml
等文件。相反,像
扫描日志/1/1/1.1.1.1.xml这样的命名是一个更好的主意


另外,注意inode限制!我曾经在EXT4文件系统上构建了一个大型的基于文件的数据库。有一天,我开始收到诸如“设备上没有空间”之类的错误消息,尽管我显然还有很多空间。真正的原因是我创建了太多的inode—可以在创建卷时手动设置限制。

我不清楚为什么要使用文件系统而不是使用某种程序内数据结构。我将搜索数千个文件,把这个负担放在我的文件系统和硬件上似乎有点可笑。我可能误解了你的答案。好吧,如果你在找文件,你可能已经或多或少知道你在找什么了,对吧?我的观点是,也许更好的目录结构/命名方案会对您有所帮助。