2011-07-10 82 views
1

如果您打開一個文件進行讀取,讀取,關閉它,然後重複該過程(在循環中),python會不斷訪問硬盤驅動器?因爲它似乎不是來自我的實驗,我想了解爲什麼。Python - 打開文件時的HardDrive訪問

一種(非常)簡單的例子:

while True: 
    file = open('/var/log/messages', 'r') 
    stuff = file.read() 
    file.close() 
    time.sleep(2) 

如果我跑這一點,我的硬盤驅動器訪問LED亮起一次,然後將硬盤驅動器保持靜止狀態。這怎麼可能? python以某種方式保持存儲在RAM中的文件的內容?因爲邏輯會告訴我它應該每兩秒訪問一次硬盤。

回答

3

如果您的操作系統或文件系統足夠聰明,可以從OS高速緩存中爲文件提供服務,但文件之間沒有更改。

+0

是的,OS中的文件緩存優化了這個操作。而所有現代操作系統都有這個功能。在linux上檢查「頂部」以確定緩衝區緩存的大小。 http://tldp.org/LDP/tlk/fs/filesystem.html – powerrox

+1

其實如果操作系統不這樣做,那真的是跛腳 –

3

答案取決於您的操作系統和硬盤的類型。大多數情況下,當您從驅動器訪問某些內容時,信息會緩存在主內存中,以備不久後再次使用。根據您的操作系統使用的替換策略,數據可能暫時保留在主內存中,或者相對較快更換。

在某些情況下,您的硬盤驅動器會將經常訪問的信息緩存到自己的內存中,然後當可能訪問驅動器時,它將更快地檢索信息並將其發送給處理器,這比搜索驅動盤片。

+0

Ohkay謝謝!看來Linux正在爲我處理事情。 –

+0

後續問題...如果在該循環運行時對文件進行了更改,則必須再次訪問硬盤驅動器才能檢測到這些更改,請更正此問題? –

+0

@python_anon - 好吧,再次依賴。在許多情況下,文件實際寫入磁盤的時間與文件「寫入」的時間之間存在滯後。一些操作系統有一個* write-through *策略,它立即將數據寫入硬盤,但即使這樣,它也會用新寫入的數據替換緩存的數據,並且讀取的文件實際上不會再回到驅動器。在另一種情況下,* write-back *,數據首先存儲在緩存中並最終進入驅動器。但在這種情況下,您的程序也不必再次顯式訪問驅動器。 –

2

Python不緩存,操作系統。你可以用top找出這些緩存的大小。在第三行,它會這樣說:

Mem: 5923332k total, 5672832k used, 250500k free, 43392k buffers 

即是說,約43MB正在使用的操作系統最近寫入或從硬盤中讀取緩存中的數據。您可以通過編寫23/proc/sys/vm/drop_caches來關閉此緩存。