如何在不重新启动计算机的情况下强制Python代码再次读取输入文件

问题描述 投票:0回答:3

我正在扫描大量文件寻找一些标记。 我开始非常有信心,一旦我运行完代码一次,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 仍然可以访问这些文件。

python python-2.7 file garbage-collection
3个回答
6
投票

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

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

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

  2. 使用一些工具在 Windows 中禁用文件缓存就像这个

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

  4. 使文件更大,这样它们就无法容纳在缓存中


1
投票

我不明白为什么这是一个问题。我不能 100% 确定 Windows 如何处理文件缓存失效,但除非“上次修改时间”发生更改,否则您、我和 Windows 会假设该文件仍然包含相同的内容。如果文件包含相同的内容,我不明白为什么从缓存读取可能会成为问题。

我非常确定,如果您更改上次修改日期,例如通过打开文件进行写访问然后立即关闭它,Windows 将对文件内容抱有足够的怀疑并使缓存无效。


0
投票

为了确保Python始终直接从硬盘读取文件(而不是从Windows缓存),您可以使用带有r模式的open()函数,而不是使用configparser.read()。这将绕过 Windows 可能使用的缓存机制。

您需要做的关键更改如下: 在将文件传递给 configparser 之前,使用 open() 显式打开该文件。 禁用文件缓存:您可以使用 os 清除文件系统缓存或使用 open() 方法强制它每次都访问磁盘。 使用 configparser.read_file():这将确保文件直接从磁盘读取,因为它使用文件句柄并且不依赖缓存机制。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.