我正在努力提高elfinder (一种基于ajax的文件管理器(elRTE.ru))的性能。
它在递归中使用os.listdir递归遍历所有目录,并且性能受到影响(比如列出一个包含3000多个文件的dir需要7秒)。
我正在努力提高它的性能,因为这是它的步行功能:
for d in os.listdir(path):
pd = os.path.join(path, d)
if os.path.isdir(pd) and not os.path.islink(pd) and self.__isAccepted(d):
tree['dirs'].append(self.__tree(pd))我的问题是:
发布于 2011-01-19 19:10:43
我只是想弄清楚如何在一个大型文件系统(35万个文件分布在大约5000个目录中)上加速os.walk。我在一个linux上,为一个ext3文件系统签名。我发现有办法让我的案子更快。
具体来说,使用自顶向下的方式,每当os.walk返回多个目录的列表时,我就使用os.stat获取每个目录的inode编号,并按inode编号对目录列表进行排序。这使得walk主要以inode顺序访问子目录,从而减少了磁盘查找。
对于我的用例,它加快了我的整个目录从18分钟到13分钟的速度.
发布于 2015-11-13 14:55:23
您签过斯堪迪尔 (以前是更好的步行)了吗?没有亲自尝试过,但是有一个在这里讨论它和这里的另一个。它声称在MacOSX/Linux上加速了3~10倍,在Windows上加速了7~50倍,避免了对os.stat()的冗余调用。从Python3.5开始,它也包含在标准库中。
Python的内置os.walk()比需要的要慢得多,因为除了对每个目录调用listdir()之外,它还对每个文件调用stat()来确定文件名是否是目录。但是Windows上的FindFirstFile / FindNextFile和Linux/OS上的readdir都已经告诉您返回的文件是否是目录,因此不需要进一步的stat系统调用。简而言之,您可以将系统调用的数量从大约2N减少到N,其中N是树中文件和目录的总数。 实际上,删除所有这些额外的系统调用使得os.walk()在上的速度是的7-50倍,而在Linux和makes 上的速度大约是前者的3到10倍。
来自项目的自述。
发布于 2010-07-01 22:26:10
您应该直接在您感兴趣的机器( OS、文件系统及其缓存等)上测量--无论os.walk是否比在特定和完全不同的机器/OS/ FS上的os.listdir更快,都不会告诉您在您的机器上的性能。
不清楚cachedir.listdir是什么意思--没有那个名称的标准库模块/函数。listdir已经一举读取了所有目录(因为它必须对结果进行排序),os.walk也是如此(因为它必须将子目录与文件分开)。如果根据您的平台的不同,您有一种快速的方式获得有关文件/目录更改的通知,那么可能值得构建一次树,并在更改通知出现时逐步编辑它.但这取决于更改和请求的相对频率,这也完全取决于您特定的应用程序环境。
https://stackoverflow.com/questions/3162002
复制相似问题