2017-06-19 73 views
3

我正在使用通過M.2連接的三星SSD的Windows 10 64位機器,6850K CPU和64 GB DDR4 RAM。我想要讀取一個大小約爲15 GB的文件到內存。我目前正在使用fstream通過對其讀取函數的單個調用來讀取整個文件中的無符號字符數組。但是,我獲得的速度並未達到SSD的最大讀取速度(SSD讀取速度爲3500 MB/s時爲1500 MB/s)。使用C++讀取大文件的SSD

所以我想知道是否有更快的方法?如果我爲較小的塊進行多個讀取調用,速度會更快嗎?如果是這樣,什麼是最佳塊大小?我看到一些人在之前提出的一些問題中提到了4K讀取。這在這種情況下適用嗎?

任何幫助表示讚賞。

我的代碼摘錄如下

我讀的代碼如下

fstream myFile; 
myFile.open("file", ios::binary | ios::in); 
myFile.read(reinterpret_cast<char*>(buf), 14929920000LL); 

其中buf是大小作爲讀取相同。

+0

您可能會受到巴士速度的限制。例如,如果讀取速度適用於SATA3,則可能正在SATA2上運行。你檢查過了嗎? – Richard

+0

另請參見:請張貼您用於閱讀的代碼。 – Richard

+0

我讀的代碼如下 'fstream的MYFILE;'' myFile.open( 「文件」,IOS ::二進制| IOS ::中);'' myFile.read(reinterpret_cast的(BUF),14929920000LL) ;' 其中buf與讀取的大小相同。 – TonyJ

回答

1

要獲得最快的讀取速度,您需要繞過Windows磁盤緩存。使用Windows API調用CreateFile,ReadFile等,並使用無緩衝讀取(通過FILE_FLAG_NO_BUFFERINGCreateFile)。這將直接從磁盤傳輸數據到您需要的內存塊,而無需將數據從一個內存地址複製到另一個內存地址。

您需要密切關注硬件可能需要的內存對齊需求。這通常需要內存地址爲512字節對齊,但一些較新的硬件可能需要4096字節,而其他硬件可能並不嚴格。 CreateFile文檔中的鏈接提供了FILE_FLAG_NO_BUFFERING的完整詳細信息。