Phy*_*win 16 python directory performance file-io
我正在努力提高elfinder的性能,这是一个基于ajax的文件管理器(elRTE.ru).
它在一个recurisve中使用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))
Run Code Online (Sandbox Code Playgroud)
我的问题是:
gar*_*on4 20
我只想弄清楚如何在一个较大的文件系统上加速os.walk(350,000个文件分布在大约50,000个目录中).我在linux盒子上使用ext3文件系统.我发现有一种方法可以加快我的速度.
具体来说,使用自上而下的漫游,每当os.walk返回多个目录的列表时,我使用os.stat获取每个目录的inode编号,并按inode编号对目录列表进行排序.这使得walk主要以inode顺序访问子目录,这减少了磁盘搜索.
对于我的用例,它加快了我的完整目录步行,从18分钟到13分钟......
gab*_*ous 11
你看过scandir(以前更好的行走)吗?没有亲自尝试,但这里有一个讨论,另一个在这里讨论.它声称在MacOSX/Linux上加速3~10x,在Windows上加速7~50x,避免了对os.stat()的冗余调用.它现在也包含在Python 3.5的标准库中.
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倍.
从项目的自述文件.
您应该直接测量您特定兴趣的计算机(操作系统,文件系统和缓存等) - 无论是否os.walk
比os.listdir
特定和完全不同的计算机更快/ OS/FS会告诉您关于您的性能的很少.
不确定你的意思cachedir.listdir
- 没有该名称的标准库模块/功能.listdir
已经读取了一个gulp中的所有目录(因为它必须对结果进行排序),os.walk
因为它必须将子目录与文件分开.如果,根据您的平台,您可以快速获得有关文件/目录更改的通知,那么可能需要构建一次树并在更改通知发生时逐步编辑它...但这取决于更改的相对频率vs请求,这又完全取决于您的具体应用环境.
归档时间: |
|
查看次数: |
24113 次 |
最近记录: |