我正在扫描大量文件,寻找一些标记。我开始非常有信心,一旦我完成代码,Python就不会重新读取磁盘中的实际文件。我发现这种行为很奇怪,因为我被告知我需要以我的方式构建文件访问的一个原因是刷新句柄和文件内容。但那不可能。
我正在阅读的列表中有9,568个文件路径。如果我关闭Python并重新启动计算机,则需要大约 6分钟来读取文件并确定是否有正则表达式返回的内容。
但是,如果我第二次运行代码,则需要 36秒。只是为了笑容,平均文件有53,000个单词。
因此,我得出结论,Python仍然可以访问它在第一次迭代中读取的文件。
我还想观察一下,我第一次这样做,我可以听到磁盘旋转(E:\ - Python在C :)。 E只是一个具有126 MB缓存的旋转磁盘 - 我认为缓存不足以保存这些文件的内容。当我以后这样做时,我听不到磁盘旋转。
这是代码
import re
test_7A_re = re.compile(r'\n\s*ITEM\s*7\(*a\)*[.]*\s*-*\s*QUANT.*\n',re.IGNORECASE)
no7a = []
for path in path_list:
path = path.strip()
with open(path,'r') as fh:
string = fh.read()
items = [item for item in re.finditer(test_7A_re,string)]
if len(items) == 0:
no7a.append(path)
continue
我关心这个有很多原因,一个是我在考虑使用多处理。但如果瓶颈在读取文件,我看不出我会获得多少收益。我也认为这是一个问题,因为我担心文件被修改,并且没有最新版本的文件可用。
我正在标记这个2.7因为我不知道这种行为是否在版本中是持久的。
要确认此行为,我修改了我的代码以作为.py文件运行,并添加了一些计时代码。然后我重新启动了我的计算机 - 第一次运行它需要5.6分钟而第二次(没有重启)时间是36秒。两种情况下的输出都相同。
真正有趣的是,即使关闭IDLE(但不重新启动计算机),运行代码仍需要36秒。
所有这些都告诉我,第一次没有从磁盘读取文件 - 这对我来说是一个惊人的行为,但它似乎很危险。
要清楚,结果是一样的 - 我相信我已经运行的时序测试以及我没有听到磁盘旋转的事实,不知何故文件仍然可供Python访问。
答案 0 :(得分:5)
这是由Windows中的缓存引起的。它与Python无关。
为了阻止Windows缓存您的读取:
在Windows中禁用分页文件并将RAM填充至最高90%
使用某种工具禁用Windows like this one中的文件缓存。
在具有有限RAM的Windows计算机上的Linux VM上运行代码。在Linux中,您可以更好地控制缓存
使文件更大,以便它们不适合缓存
答案 1 :(得分:0)
我不明白为什么这是一个问题。我不是100%肯定Windows如何处理文件缓存失效,但除非"最后修改时间"更改,您和我和Windows将假定该文件仍保留相同的内容。如果文件包含相同的内容,我不明白为什么从缓存中读取可能是个问题。
我非常确定如果您更改上次修改日期,例如,打开文件进行写访问,然后立即关闭它,Windows将对文件内容抱有足够的疑虑并使缓存无效。