我使用os.walk
来迭代,比如说,1000个文件(只是迭代,不处理这些文件)。
第一次运行很慢,但随后的运行(在同一条路径上)大约快20倍。在
据我所知,os.walk
和os.listdir
(由os.walk
使用)没有进行任何缓存,FindFirstFile
/FindNextFile
(在我的Windows平台上由os.listdir
使用)。在
那么这是因为页面缓存还是其他原因?在
仅供参考,我正在尝试编写一个备份应用程序,需要处理大量的文件。如果确实是页面缓存造成的,那么我需要编写自己的缓存机制。在
Tags:
您的操作系统在这里进行缓存;目录查找需要磁盘访问,这是很慢的,因此这样的访问被大量缓存。在
例如,
ntfs.sys
驱动程序uses the Data Map service缓存文件系统元数据,如目录列表。在我知道您已经得到了问题的答案,但这让我对Linux中这些缓存的工作方式感到好奇,所以我执行了一个小的基准测试。在
我创建了一个有1000个子目录的目录,在每个子目录中我创建了1000个文件。总共1000个文件夹和100万个文件。在
这应该会给
^{pr2}$os.walk
一些工作。接下来,我创建了一个测试脚本,它只计算目录中的文件数,递归地使用os.walk
:我运行了几次,结果平均执行时间为2.27秒。在
接下来,我再次运行测试几次,但在每次执行之间刷新页面缓存,然后再次刷新dentry/inode缓存,最后执行相同的操作,但刷新了以上所有缓存。在
结果:
基准测试是在新的SSD驱动器上的
ext4
文件系统上运行的。Linux版本是3.17.7。在毫不奇怪,页面缓存以及dentries/inodes缓存对这个基准测试的结果有很大影响。不过,我有点惊讶,只刷新页面缓存会产生如此大的差异,因为应该可以一次读取这些文件的大部分文件系统元数据,但我可能遗漏了一些东西。在
我会说页面缓存没有多大区别,因为包含文件系统元数据的页面的缓存未命中相对较少。但我的直觉似乎错了。你知道为什么吗?在
相关问题 更多 >
编程相关推荐