看板 Python 關於我們 聯絡資訊
讀取一個檔案,關閉後,再次重新讀取同一個檔案 其資料似乎在第一次讀取時會被 windows 放到記憶體裡 使第二次讀取時直接從記憶體裡讀取,而不是從硬碟讀取 雖然這樣讓讀取速度加快非常多,但是我是想要比對檔案是否有出錯 如果讀取資料是讀記憶體那就沒意義了 請問該怎麼做才能讓第二次讀取檔案時從硬碟讀取? 舉例來說,將下面的 code 連續執行兩次 import datetime t1 = datetime.datetime.today() with open('filename', 'rb') as file: data = file.read() t2 = datetime.datetime.today() print t2-t1 t1 = datetime.datetime.today() with open('filename', 'rb') as file: data = file.read() t2 = datetime.datetime.today() print t2-t1 得到結果 C:\test>test.py 0:00:05.925000 0:00:00.378000 C:\test>test.py 0:00:00.328000 0:00:00.353000 看起來只有第一次讀取資料花了五秒鐘,第二三四次都是瞬間讀完 資料大小是 600MB,花五秒鐘讀取跟正常硬碟讀取速度差不多 其他的怎麼看都不像是從硬碟讀取的阿 還是我哪裡理解有誤?Google 也不知道要打什麼關鍵字才能找到答案 請指點一下,謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.46.150.93
KSJ:你讀完第一次後 修改檔案內容 第二次讀檔會跟著更新吧? 01/09 12:21
timTan:我覺得不用考慮到這個層次耶? 01/09 12:43
timTan:懷疑到這個層次滿細心的,但os幫你做這件事,不易出錯吧? 01/09 12:44
timTan:你就想成記憶体裡的跟硬碟裡的事一樣的吧。 01/09 12:44
chchwy:不需要擔心這種事 OS會搞定 01/09 14:02
os653:我對OS還挺有信心的,不過對硬體沒啥信心 XD 01/09 18:08
os653:舉例來說,以前有次IDE/SATA轉USB傳輸線出包,多焊一個電阻 01/09 18:11
os653:導致資料寫入沒問題,但讀取時會隨機出錯,檔案比對會差一點 01/09 18:12
os653:那次事件相關討論 http://ppt.cc/-cPq,晶片商還出來救火 01/09 18:14
os653:自己也有遇過類似情形,但確定是硬碟出錯 01/09 18:15
os653:像這種情形,有辦法寫程式在複製資料的時候就找出問題嗎? 01/09 18:17
os653:本來是想寫個帶檢查的複製程式,但不會真正讀取硬碟沒用... 01/09 18:20
os653:TeraCopy也有這種檢查功能,不曉得有沒有一樣的問題 01/09 18:50
angusj:用os.O_DIRECT參數open? 01/09 20:17
os653:python 2.6.6 64bit沒這個參數耶,document說 01/09 21:15
os653:O_ASYNC, O_DIRECT, O_DIRECTORY, O_NOFOLLOW, O_NOATIME 01/09 21:16
os653:These constants are GNU extensions and not present if 01/09 21:16
os653:they are not defined by the C library. 01/09 21:16
angusj:這可能是指win底下沒這參數,畢竟這需要OS支援... 01/09 21:39
angusj:open有個buffering參數,設為0試試... 01/09 21:50
os653:那個沒用,之前就試過了 01/09 21:53
os653:有找到兩個不知道可不可行的方法 01/09 21:57
os653:一個是http://ppt.cc/SStY,讓file cache to be invalidated 01/09 21:58
os653:不過電腦已經移除C++很久了,現在也沒空間重裝 XD 01/09 21:59
os653:而且底下有人說在一台電腦可行但另一台電腦不行,不太穩定 01/09 22:00
os653:另外一個是暴力法,直接複製另一個垃圾大檔案把cache清掉 01/09 22:01
os653:不過在同時間有其他程式在存取之前的檔案,此法就很可能無效 01/09 22:02
os653:所以這方法不穩定而且有點蠢...還有沒有其他解法 Q_Q 01/09 22:03
os653:而且第一個方法用pywin寫也沒用... 01/09 22:36
modocolor:你需要翻資料或聯絡 python team 去確認 01/27 23:45
modocolor:也可以改用 Windows 32 API 去做改善,彈性較好 01/27 23:52
modocolor:像是效能檢測的軟體就只能用這種方式測試 01/27 23:52
modocolor:硬體讀寫的這些事情 OS 會接管 所以建議改用Win API @_@ 01/27 23:53