我如何强制python代码再次读取输入文件,而无需重新启动计算机



我正在通过大量文件扫描寻找一些标记。我开始非常有信心的是,一旦我一次完成代码,Python就不会从磁盘中重新读取实际文件。我发现这种行为很奇怪,因为有人告诉我,我需要以我的文件访问构建文件和文件内容的方式构建文件访问。但这不是。

我正在阅读的列表中有9,568个文件路径。如果我关闭Python并重新启动计算机,则大约需要 6分钟读取文件并确定是否有正则表达式中返回任何内容。

但是,如果我第二次运行代码,则大约需要 36秒。只是为了笑,平均文件有53,000个单词。

因此,我得出的结论是,Python仍然可以访问它在第一次迭代中读取的文件。

我还想观察到我第一次这样做时,我可以听到磁盘旋转(e: - python在c :)上。E只是一个带有126 MB缓存的旋转磁盘 - 我认为缓存不够大,无法容纳这些文件的内容。稍后这样做时,我听不到磁盘旋转。

这是代码

import re
test_7A_re = re.compile(r'ns*ITEMs*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秒。在两种情况下,输出都是相同的。

真正有趣的是,即使关闭空闲(但不要重新启动我的计算机),运行代码

仍然需要36秒

所有这些都向我表明,第一次之后没有从磁盘上读取文件 - 这对我来说是惊人的行为。

要明确,结果是相同的 - 我相信,鉴于我运行的时序测试以及我没有听到磁盘旋转的事实,即Python仍然可以访问文件。

这是由Windows中的缓存引起的。它与python无关。

为了阻止Windows缓存您的读取:

  1. 在Windows中禁用分页文件,并将RAM填充高达90%

  2. 使用一些工具禁用窗口中的文件缓存。

  3. 在Windows计算机上的Linux VM上运行代码,该电路机的RAM有限。在Linux中,您可以更好地控制缓存

  4. 使文件更大,因此它们不适合缓存

我看不到为什么这是一个问题。我并不是100%确定Windows如何处理文件缓存无效,但是除非"最后修改时间"更改,否则您和我的Windows会假设该文件仍然保留相同的内容。如果文件包含相同的内容,我看不出为什么从缓存中阅读可能是一个问题。

我很确定,如果您通过打开写入访问的文件,然后立即将其关闭,Windows将对文件内容持续充足并使缓存无效。

相关内容

最新更新