關於磁盤的讀寫性能曾經一直是我頭疼的地方,涉及研發或者測試時不清楚過程導致結果不盡人意。一起認識下關於磁盤的讀寫原理和順序讀寫,隨機讀寫。
首先磁盤是如何存儲數據的?
信息存儲在硬盤裡,把它拆開也看不見裡面有任何東西,只有些盤片。假設,你用顯微鏡把盤片放大,會看見盤片表面凹凸不平,凸起的地方被磁化,凹的地方是沒有被磁化;凸起的地方代表數字1(磁化為1),凹的地方代表數字0。因此硬盤可以以二進制來存儲表示文字、圖片等信息。
機械盤和固態盤的區別:
機械盤:數據是存儲的扇區的,讀寫是依靠磁頭的擺動尋址的。順序讀寫主要時間花費在了傳輸時間,隨機讀寫需要多次尋道和旋轉延遲。
固態盤:是由控制單元和固態存儲單元(DRAM或FLASH芯片)組成,存儲單元負責存儲數據,控制單元負責讀取、寫入數據。
由於固態硬盤沒有普通硬盤的機械結構,也不存在機械硬盤的尋道問題。
順序讀寫和隨機讀寫對比:
隨機讀寫是相對順序讀寫而言的,所謂隨機讀寫,是指可以在任何時候將存取文件的指針指向文件內容的任何位置。一般情況下SAS機械硬盤主要是看順序讀寫性能,SSD固態盤主要看隨機讀寫性能。
文件的操作方式:
順序讀寫:文件指針只能從頭移動到尾。
隨機讀寫:文件指針可以隨意移動,根據需要。
隨機示例:
假設存在一個文件尺寸為1024個字節的文件,如果按照順序存取原則的話,我們只能採用類似於FileStream.read()或者FileReader.readLine()的方式來一段一段,或者一行一行地讀取。
RandomAccessFile類的核心價值在於RandomAccessFile.seek()方法,通過這個方法,可以任意地指定當前存取文件的指針位置。
隨時調用RandomAccessFile類的getFilePionter()方法,獲取文件指針當前距離文件起始位置的偏移量。
小結:在日常項目開發中在設計存儲時,一定要考慮順序和隨機,優化其性能達到最高。例如,當前大多數數據庫使用的都是傳統的機械磁盤,因此,整個系統設計要儘可能順序I/O,避免昂貴的尋道時間和旋轉延遲的開銷.
更多內容請關注每日編程,每天進步一點。
閱讀更多 每日編程 的文章