簡體   English   中英

如何在不重新啟動計算機的情況下強制Python代碼再次讀取輸入文件

[英]How can I force Python code to read input files again without rebooting my computer

我正在掃描大量文件,尋找一些標記。 我開始真正有信心,一旦我遍歷代碼一次,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文件。

這是由Windows中的緩存引起的。 它與Python不相關。

為了阻止Windows緩存您的讀取:

  1. 在Windows中禁用分頁文件,並將RAM最多填充90%

  2. 使用某種工具在Windows中禁用文件緩存, 就像這樣一種

  3. 在內存有限的Windows計算機上的Linux VM上運行代碼。 在Linux中,您可以更好地控制緩存

  4. 使文件更大,以使它們不適合緩存

我不明白為什么這是一個問題。 我不確定Windows如何處理文件緩存無效,但是除非“上次修改時間”更改,否則您和我以及Windows都將假定該文件仍包含相同的內容。 如果文件包含相同的內容,我不明白為什么從緩存中讀取可能會成為問題。

我非常確定,如果您更改了最后修改日期,例如,通過打開文件進行寫訪問然后立即將其關閉,Windows將對文件內容持有足夠的懷疑,並使緩存無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM