2013-10-14 44 views
0

一次讀取整個文件而不是根據需要讀取字節有什麼優缺點?那麼,有沒有優勢:讀取整個文件是否有優勢

file_handle = open("somefile", rb) 
file_contents = file_handle.read() 
# do all the things using file_contents 

相比:

file_handle = open("somefile", rb) 
part1 = file_handle.read(10) 
# do some stuff 
part2 = file_handle.read(8) 
# do some more stuff etc 

背景:我寫的p代碼(字節碼)解釋在Python,並最初只是寫了一個天真的實現,它讀取字節根據需要從文件中執行必要的操作等。我展示程序的朋友建議我應該將整個文件讀入內存(Python列表?),然後從內存中進行處理,以避免大量慢速讀取磁盤。測試文件目前小於1KB,可能最多隻有100KB,所以我期望操作系統和磁盤控制器系統能夠緩存文件,避免因反覆讀取文件的小塊而導致的任何性能問題。

+1

你的朋友是對的,你對運行時環境的信心可能是錯誤的。它會試圖儘可能地將你從細節上隔離開來,但它不會有太大的幫助。 –

回答

2

如果你想做任何形式的隨機訪問,那麼把它放在一個列表中將比從磁盤尋找要快得多。即使操作系統確實緩存了磁盤訪問,您仍然正在訪問另一層緩存。無論如何,你無法確定操作系統的行爲。

這裏有3情況下,我能想到的,將激勵內存做:

  • 你可能有一個跳轉指令,你可以通過添加一些你的程序計數器執行。這樣做到數組的索引與查找文件是一個很好的用例。

  • 您可能想優化虛擬機的行爲,這可能涉及多次讀取文件。兩次掃描列表與兩次讀取文件的速度會更快。

  • 根據操作碼和語言的語法,您可能希望在「循環」中向前看,以加快執行速度。如果這樣做結束了兩次尋找,那麼這可能會導致性能下降。

如果你的文件總是足夠小,適合內存,那麼它可能是值得一讀的內存。用真實程序對其進行分析,看看它是否明顯更快。

3

拋開緩存,你仍然有系統調用。每個read()都會產生一個模式切換來觸發內核。您可以通過strace或其他工具查看系統調用。

雖然這對於一個100 KB的文件來說可能還爲時過早。與往常一樣,測試您的代碼知道肯定。

1

如果您正在尋找性能,我會建議您通過generators。由於你的文件很小,內存不會成爲大問題,但它仍然是一個很好的做法。從光盤多次讀取文件是可擴展解決方案的一個明確瓶頸。

2

read()的單個呼叫將比對多個呼叫read()的呼叫更快。權衡是,只需一次調用,您必須能夠一次將所有數據放入內存,而多次讀取則只需保留一小部分數據。對於只有幾千字節或兆字節的文件,差異不會引人注意。對於有幾個演唱會的文件,記憶變得更加重要。

此外,執行單次讀取意味着所有數據都必須存在,而多次讀取可用於處理從外部源流入的數據。

+0

打開文件作爲緩衝流減少多次讀取的影響? – Caltor

相關問題