使用 Python 更快地查找大文件?

use*_*019 2 python linux

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

我尝试过很多方法,例如使用脚本调用 du -h,但 du 速度太慢,无法遍历 1TB 大的目录。我也尝试过像 find ./ +200G 这样的 find 命令,但这也需要永远。

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

Jea*_*bre 5

“你不能做得更好”这一说法并不正确os.walk()

\n

scandir据说速度快了2到20倍。

\n

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

\n
\n

Python\xe2\x80\x99s 内置的 os.walk() 比它需要的要慢得多,因为 \xe2\x80\x93 除了在每个目录 \xe2\x80\x93 上调用 listdir() 之外,它还调用 stat () 对每个文件判断文件名是否是目录。但是 Windows 上的 FindFirstFile / FindNextFile 和 Linux/OS X 上的 readdir 都已经告诉您返回的文件是否是目录,因此不需要进一步的 stat 系统调用。简而言之,您可以将系统调用的数量从大约 2N 减少到 N,其中 N 是树中文件和目录的总数。

\n

实际上,删除所有这些额外的系统调用使得 os.walk() 在 Windows 上的速度大约提高 7-50 倍,在 Linux 和 Mac OS X 上大约提高 3-10 倍。所以我们\xe2\x80\x99 不是在谈论关于微观优化。

\n
\n

从 python 3.5 开始,由于PEP 471scandir现在是内置的,在os包中提供。小(未经测试)示例:

\n
for dentry in os.scandir("/path/to/dir"):\n    if dentry.stat().st_size > max_value:\n       print("{} is biiiig".format(dentry.name))\n
Run Code Online (Sandbox Code Playgroud)\n

(当然,stat在某些时候您需要,但是在使用该函数时隐式os.walk调用。此外,如果文件具有某些特定扩展名,则仅当扩展名匹配时才可以执行,从而节省更多)statstat

\n

还有更多内容:

\n
\n

因此,除了提供 scandir() 迭代器函数来直接调用之外,Python 现有的 os.walk() 函数还可以大大加快速度。

\n
\n

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

\n

根据我的经验,增加stat网络驱动器上的调用对于性能而言是灾难性的,因此,如果您的目标是网络驱动器,那么您将比本地磁盘用户从这种增强功能中受益更多。

\n

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

\n