很多工作已經進入優化數據庫的設計,特別是在最優化的方式來讀寫磁盤從數據(包括主軸和SSD)領域。
來自工作的知識表明,讀取和寫入塊邊界,匹配正在運行的文件系統的塊大小,是最理想的方法。
問題
說我是在一個相對較低的存儲環境中操作,並希望使用小32MB內存映射文件讀取和寫入一個巨大的500GB文件的內容。
如果我使用Java的NIO機制,特別是MappedByteBuffer(Java的內存映射文件機制),在配對數據之前,我需要注意在塊邊界(例如4KB)上執行READ和WRITE操作我需要,或者我可以在任何我想要的位置發佈R/W操作,並允許操作系統,VM分頁邏輯,文件系統和存儲固件處理操作的優化以及額外的塊數據的剔除,需要?
額外的細節
的原因的問題是在數據庫設計中,我看到這個強迫重點區塊優化到如此地步,似乎沒有存在的世界裏,你將永遠只是讀取和寫入數據而沒有塊的概念。
讓我感到困惑的是,文件系統是強制執行塊單位操作的文件系統,爲什麼我的高級應用程序需要擔心這個問題呢?如果我想要偏移71處的17,631個字節,我不能只抓住它們並讀入它們,或者確定 的讀取操作開始於塊0並且落在塊0, 1和2 ...將所有這3個塊讀入內部字節[],然後剔除我想要的17,631個字節?
如果關於數據庫設計的文獻對這個塊想法沒有那麼虔誠,那麼這個問題就不會出現在我的腦海裏,但是因爲它,我在想,如果我在這裏丟失了關鍵細節WRT文件系統和優化塊設備I/O。
謝謝您的閱讀。
我很欣賞這個答覆,這是我的期望以及我發現的一篇文章確認(做了一些基準測試,並且顯示讓操作系統管理VM分頁進出是相當高效的)。雖然希望得到一個下落不明的確認。在回答這個問題之前,我會再堅持一會兒。 – 2012-02-06 23:07:15