是手术室步行()由于页面缓存,第一次运行后速度快得多?

2024-09-30 10:29:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用os.walk来迭代,比如说,1000个文件(只是迭代,不处理这些文件)。 第一次运行很慢,但随后的运行(在同一条路径上)大约快20倍。在

据我所知,os.walkos.listdir(由os.walk使用)没有进行任何缓存,FindFirstFile/FindNextFile(在我的Windows平台上由os.listdir使用)。在

那么这是因为页面缓存还是其他原因?在

仅供参考,我正在尝试编写一个备份应用程序,需要处理大量的文件。如果确实是页面缓存造成的,那么我需要编写自己的缓存机制。在


Tags: 文件路径应用程序oswindows原因平台页面
2条回答

您的操作系统在这里进行缓存;目录查找需要磁盘访问,这是很慢的,因此这样的访问被大量缓存。在

例如,ntfs.sys驱动程序uses the Data Map service缓存文件系统元数据,如目录列表。在

我知道您已经得到了问题的答案,但这让我对Linux中这些缓存的工作方式感到好奇,所以我执行了一个小的基准测试。在

我创建了一个有1000个子目录的目录,在每个子目录中我创建了1000个文件。总共1000个文件夹和100万个文件。在

seq 1000 | parallel "mkdir {} && seq 1000 | parallel touch {}/\{\}"

这应该会给os.walk一些工作。接下来,我创建了一个测试脚本,它只计算目录中的文件数,递归地使用os.walk

^{pr2}$

我运行了几次,结果平均执行时间为2.27秒。在

接下来,我再次运行测试几次,但在每次执行之间刷新页面缓存,然后再次刷新dentry/inode缓存,最后执行相同的操作,但刷新了以上所有缓存。在

To free pagecache:
        echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
        echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
        echo 3 > /proc/sys/vm/drop_caches

结果:

            no flush  page cache  dentries/inodes  all
mean        2.27      2.56        4.24             4.80
stdev       0.052     0.055       0.127            0.108
%RSD        2.27%     2.15%       2.99%            2.26%
median      2.26      2.54        4.21             4.78
iterations  27        27          31               10

基准测试是在新的SSD驱动器上的ext4文件系统上运行的。Linux版本是3.17.7。在

毫不奇怪,页面缓存以及dentries/inodes缓存对这个基准测试的结果有很大影响。不过,我有点惊讶,只刷新页面缓存会产生如此大的差异,因为应该可以一次读取这些文件的大部分文件系统元数据,但我可能遗漏了一些东西。在

我会说页面缓存没有多大区别,因为包含文件系统元数据的页面的缓存未命中相对较少。但我的直觉似乎错了。你知道为什么吗?在

相关问题 更多 >

    热门问题