使用Python查找大文件的更快方法?

时间:2017-09-10 19:51:52

标签: python linux

我正在尝试使用Python来查找一个更快的方法来筛选一个包含大约9个其他目录的大目录(大约1.1TB),并在多个Linux服务器上查找大于200GB或类似文件的文件,以及它必须是Python。

我尝试了很多东西,比如用脚本调用du -h但是du太慢了,无法通过一个大到1TB的目录。 我也试过像find ./ + 200G这样的find命令,但这也是需要的。

我也尝试过os.walk()并执行.getsize(),但这是同样的问题 - 太慢了。 所有这些方法需要数小时和数小时,如果有人能够帮助我,我需要帮助找到另一种解决方案。因为我不仅要在一台服务器上搜索大文件,而且还要通过近300台服务器来输出并输出所有文件的巨大列表> 200GB,我试过的三种方法都无法完成。 任何帮助表示赞赏,谢谢!

2 个答案:

答案 0 :(得分:2)

你不能做得比os.walk()

更好 据说

scandir的速度提高了2到20倍。

来自https://pypi.python.org/pypi/scandir

  Python的内置os.walk()明显慢于它需要的速度,因为 - 除了在每个目录上调用listdir()之外 - 它在每个文件上调用stat()来确定文件名是否是目录或不。但是Windows上的FindFirstFile / FindNextFile和Linux / OS X上的readdir都已经告诉您返回的文件是否是目录,因此不需要进一步的统计系统调用。简而言之,您可以将系统调用的数量从大约2N减少到N,其中N是树中文件和目录的总数。

     

实际上,删除所有这些额外的系统调用会使os.walk()在Windows上快7到50倍,在Linux和Mac OS X上快3到10倍。所以我们不是在谈论微优化。

从python 3.5开始,感谢PEP 471scandir现已内置,在os包中提供。小(未经测试)的例子:

for dentry in os.scandir("/path/to/dir"):
    if dentry.stat().st_size > max_value:
       print("{} is biiiig".format(dentry.name))

(当然,您在某些时候需要stat,但使用os.walk时,您在使用该功能时会隐式调用stat此外,如果文件有一些特定的扩展名,只有在扩展程序匹配时才会执行stat,从而节省更多费用

还有更多内容:

  

因此,除了提供直接调用的scandir()迭代器函数外,Python现有的os.walk()函数也可以大量增加。

因此,迁移到Python 3.5+可以神奇地加速os.walk,而无需重写代码。

根据我的经验,将网络驱动器上的stat次呼叫相乘会带来灾难性的性能,因此如果您的目标是网络驱动器,那么您将比本地磁盘用户更受益于此增强功能。

在网络驱动器上获得性能的最佳方法是在本地安装驱动器的计算机上运行扫描工具(例如,使用ssh)。它不太方便,但值得。

答案 1 :(得分:0)

很难想象您会找到一种比os.walk()du快得多的遍历目录的方法。并行化搜索可能会对某些设置(例如SSD)有所帮助,但它不会产生显着的差异。

提高速度的简单方法是每小时左右在后台自动运行脚本,让实际脚本只需获取结果。如果结果需要是最新的,这将无济于事,但可能适用于许多监控设置。