python - 一种比 os.listdir 更快的目录遍历方式?

标签 python file-io directory performance

我正在尝试提高 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))

我的问题是:

  1. 如果我更改 os.walk 而不是 os.listdir ,它会提高性能吗?
  2. 使用 dircache.listdir() 怎么样?在初始请求时缓存整个目录/子目录内容并返回缓存结果,如果没有新文件上传或文件没有更改?
  3. 是否有其他更快的目录遍历方法?
  4. 任何其他用 python 编写的快速服务器端文件浏览器(但我更喜欢让这个更快)?

最佳答案

我只是想弄清楚如何在大型文件系统(分布在大约 50,000 个目录中的 350,000 个文件)上加速 os.walk。我在 linux 机器上使用 ext3 文件系统。我发现有一种方法可以加快我的情况。

具体来说,使用自上而下的遍历,每当 os.walk 返回一个以上目录的列表时,我使用 os.stat 获取每个目录的 inode 编号,并按 inode 编号对目录列表进行排序。这使得 walk 主要以 inode 顺序访问子目录,从而减少磁盘寻道。

对于我的用例,它加快了我的完整目录步行时间,从 18 分钟缩短到 13 分钟...

关于python - 一种比 os.listdir 更快的目录遍历方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3162002/

相关文章:

ios - Objective-C 中如何从文件中读取数据?

php - 使用 PHP 将文件夹重命名为子文件夹

javascript - 为 Javascript 重写根目录路径 "/"

python - "this"模块的源代码是做什么的?

c++ - C++中如何从文件中读取整数值

c# - 根据从 C# 编写的方式,两个相同的文件具有不同的文件大小

c++ - 如何使用 Boost Filesystem 复制目录

python - 按每月营业日对 DataFrame 进行分组

python - 与 any() 函数相反

python - 将 pandas 中的字符串拆分为单独的列