我正在尝试提高 elfinder 的性能,这是一个基于 ajax 的文件管理器 (elRTE.ru)。
它在递归中使用 os.listdir 递归地遍历所有目录并且性能受到影响(比如列出一个包含 3000 多个文件的目录需要 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))
我的问题是:
- 如果我更改 os.walk 而不是 os.listdir ,它会提高性能吗?
- 使用 dircache.listdir() 怎么样?在初始请求时缓存整个目录/子目录内容并返回缓存结果,如果没有新文件上传或文件没有更改?
- 还有其他更快的目录遍历方法吗?
- 任何其他用 python 快速编写的服务器端文件浏览器(但我更喜欢让这个更快)?
原文由 Phyo Arkar Lwin 发布,翻译遵循 CC BY-SA 4.0 许可协议
我只是想弄清楚如何在大型文件系统(分布在大约 50,000 个目录中的 350,000 个文件)上加速 os.walk。我在 linux 机器上使用 ext3 文件系统。我发现有一种方法可以加快我的情况。
具体来说,使用自上而下的遍历,每当 os.walk 返回一个以上目录的列表时,我使用 os.stat 获取每个目录的 inode 编号,并按 inode 编号对目录列表进行排序。这使得 walk 主要以 inode 顺序访问子目录,从而减少磁盘查找。
对于我的用例,它加快了我的完整目录步行时间,从 18 分钟缩短到 13 分钟……