[問題] 如何從硬碟讀取資料而不是從記憶體

看板Python作者 (allstar)時間14年前 (2012/01/09 11:45), 編輯推噓4(4029)
留言33則, 6人參與, 最新討論串1/2 (看更多)
讀取一個檔案,關閉後,再次重新讀取同一個檔案 其資料似乎在第一次讀取時會被 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

01/09 12:21, , 1F
你讀完第一次後 修改檔案內容 第二次讀檔會跟著更新吧?
01/09 12:21, 1F

01/09 12:43, , 2F
我覺得不用考慮到這個層次耶?
01/09 12:43, 2F

01/09 12:44, , 3F
懷疑到這個層次滿細心的,但os幫你做這件事,不易出錯吧?
01/09 12:44, 3F

01/09 12:44, , 4F
你就想成記憶体裡的跟硬碟裡的事一樣的吧。
01/09 12:44, 4F

01/09 14:02, , 5F
不需要擔心這種事 OS會搞定
01/09 14:02, 5F

01/09 18:08, , 6F
我對OS還挺有信心的,不過對硬體沒啥信心 XD
01/09 18:08, 6F

01/09 18:11, , 7F
舉例來說,以前有次IDE/SATA轉USB傳輸線出包,多焊一個電阻
01/09 18:11, 7F

01/09 18:12, , 8F
導致資料寫入沒問題,但讀取時會隨機出錯,檔案比對會差一點
01/09 18:12, 8F

01/09 18:14, , 9F
那次事件相關討論 http://ppt.cc/-cPq,晶片商還出來救火
01/09 18:14, 9F

01/09 18:15, , 10F
自己也有遇過類似情形,但確定是硬碟出錯
01/09 18:15, 10F

01/09 18:17, , 11F
像這種情形,有辦法寫程式在複製資料的時候就找出問題嗎?
01/09 18:17, 11F

01/09 18:20, , 12F
本來是想寫個帶檢查的複製程式,但不會真正讀取硬碟沒用...
01/09 18:20, 12F

01/09 18:50, , 13F
TeraCopy也有這種檢查功能,不曉得有沒有一樣的問題
01/09 18:50, 13F

01/09 20:17, , 14F
用os.O_DIRECT參數open?
01/09 20:17, 14F

01/09 21:15, , 15F
python 2.6.6 64bit沒這個參數耶,document說
01/09 21:15, 15F

01/09 21:16, , 16F
O_ASYNC, O_DIRECT, O_DIRECTORY, O_NOFOLLOW, O_NOATIME
01/09 21:16, 16F

01/09 21:16, , 17F
These constants are GNU extensions and not present if
01/09 21:16, 17F

01/09 21:16, , 18F
they are not defined by the C library.
01/09 21:16, 18F

01/09 21:39, , 19F
這可能是指win底下沒這參數,畢竟這需要OS支援...
01/09 21:39, 19F

01/09 21:50, , 20F
open有個buffering參數,設為0試試...
01/09 21:50, 20F

01/09 21:53, , 21F
那個沒用,之前就試過了
01/09 21:53, 21F

01/09 21:57, , 22F
有找到兩個不知道可不可行的方法
01/09 21:57, 22F

01/09 21:58, , 23F
一個是http://ppt.cc/SStY,讓file cache to be invalidated
01/09 21:58, 23F

01/09 21:59, , 24F
不過電腦已經移除C++很久了,現在也沒空間重裝 XD
01/09 21:59, 24F

01/09 22:00, , 25F
而且底下有人說在一台電腦可行但另一台電腦不行,不太穩定
01/09 22:00, 25F

01/09 22:01, , 26F
另外一個是暴力法,直接複製另一個垃圾大檔案把cache清掉
01/09 22:01, 26F

01/09 22:02, , 27F
不過在同時間有其他程式在存取之前的檔案,此法就很可能無效
01/09 22:02, 27F

01/09 22:03, , 28F
所以這方法不穩定而且有點蠢...還有沒有其他解法 Q_Q
01/09 22:03, 28F

01/09 22:36, , 29F
而且第一個方法用pywin寫也沒用...
01/09 22:36, 29F

01/27 23:45, , 30F
你需要翻資料或聯絡 python team 去確認
01/27 23:45, 30F

01/27 23:52, , 31F
也可以改用 Windows 32 API 去做改善,彈性較好
01/27 23:52, 31F

01/27 23:52, , 32F
像是效能檢測的軟體就只能用這種方式測試
01/27 23:52, 32F

01/27 23:53, , 33F
硬體讀寫的這些事情 OS 會接管 所以建議改用Win API @_@
01/27 23:53, 33F
文章代碼(AID): #1F2cB7yG (Python)
文章代碼(AID): #1F2cB7yG (Python)