Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不重新启动计算机的情况下强制Python代码再次读取输入文件_Python_Python 2.7_File_Garbage Collection - Fatal编程技术网

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

如何在不重新启动计算机的情况下强制Python代码再次读取输入文件,python,python-2.7,file,garbage-collection,Python,Python 2.7,File,Garbage Collection,我正在扫描大量文件,寻找一些标记。我开始确信,一旦我运行了一次代码,Python就不会从磁盘上重新读取实际文件。我觉得这种行为很奇怪,因为有人告诉我,我需要以现有的方式构造文件访问的一个原因是刷新句柄和文件内容。但那不可能 我正在读取的列表中有9568个文件路径。如果关闭Python并重新启动计算机,读取文件并确定正则表达式是否返回任何内容大约需要6分钟 但是,如果我再次运行代码,大约需要36秒。就笑而言,平均文档有53000字 因此,我的结论是Python仍然可以访问它在第一次迭代中读取的文件

我正在扫描大量文件,寻找一些标记。我开始确信,一旦我运行了一次代码,Python就不会从磁盘上重新读取实际文件。我觉得这种行为很奇怪,因为有人告诉我,我需要以现有的方式构造文件访问的一个原因是刷新句柄和文件内容。但那不可能

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

但是,如果我再次运行代码,大约需要36秒。就笑而言,平均文档有53000字

因此,我的结论是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秒。两种情况下的输出相同

真正有趣的是,即使闲置关机(但不要重新启动计算机),运行代码仍然需要36秒

所有这些对我来说都表明,文件在第一次读取后不会从磁盘读取-这对我来说是一种惊人的行为,但似乎很危险


要明确的是,结果是一样的——我相信,考虑到我运行的计时测试以及我没有听到磁盘旋转的事实,Python仍然可以访问这些文件。

这是由Windows中的缓存造成的。它与Python无关

要阻止Windows缓存您的读取,请执行以下操作:

  • 在Windows中禁用分页文件并将RAM填充到90%

  • 使用一些工具在Windows中禁用文件缓存

  • 在内存有限的Windows计算机上的Linux虚拟机上运行代码。在Linux中,您可以更好地控制缓存

  • 使文件大得多,这样它们就不能放在缓存中


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


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

    什么意思,“第一次读取后不会读取文件”?如果没有读取,您不会得到错误的结果吗?您是否检查了分配给Python的内存在第二次迭代中是否增加了?作为一个实验,您可以尝试在第一次迭代结束时运行
    gc.collect
    。实际上,我已经为此绞尽脑汁了一段时间,并尝试了我能找到的各种gc技巧。没有一个有效,所以现在@user6401364似乎有最好的解释。我将通过在每个文件中添加一个换行符来测试这一点。这真的很酷。我将不得不再四处闲逛一些,我不会想到这是由窗户驱动的。你是说Python向操作系统请求文件,操作系统检查它是否有缓存副本-如果有,那么缓存副本将传递给Python,否则它将获取文件?没错,好的部分是,如果文件因任何原因发生更改,windows将处理向Python提供更新文件的问题。因此,python代码总是以完全相同的方式运行,但windows第二次从内存而不是直接从磁盘为其提供文件另一种方式是读取不同的文件,要填充缓存并使其过期,您要测试的文件如果Windows正在通过文件的最新版本,这不是问题,事实上,我喜欢速度提高,但出于明显的原因,关于潜在的后果。我想你是说除非文件被更改,否则我不能强制从磁盘读取。Python传递路径-Windows知道它有对字符串的引用-检查修改的日期-看到没有更改并将其引用传递给Python?这是一个问题,因为我不知道Windows会跟踪文件并在文件被修改时替换新文件。现在,我在仔细确认我的文件似乎没有被再次阅读后提出了这个问题,我得到了答案,这不再是一个问题。但您肯定可以看到,如果没有我的操作系统正在管理文件访问的信息,这将是一个问题。我理解并钦佩您希望了解“幕后”正在发生的事情,即使是从python这样的高级语言。请记住,挖掘最终会引导您找到操作系统的内部结构,对于每个主要操作系统来说,这些内部结构都应该是接近最优的。这应该可以让你不想再去看电影了