使用 C++ 读取大文件的 SSD

Ton*_*nyJ 5 c++ file

我正在使用 Windows 10 64 位机器、6850K CPU 和 64 GB DDR4 RAM,通过 M.2 连接三星 SSD。我想将一个大小约为 15 GB 的文件读取到内存中。我目前正在使用 fstream 将整个文件读入一个无符号字符数组,使用对其 read 函数的单个调用。但是,我达到的速度没有达到 SSD 的最大读取速度(SSD 读取速度约为 3500 MB/s 时为 1500 MB/s)。

所以我想知道是否有更快的方法?如果我对较小的块进行多次读取调用会更快吗?如果是这样,最佳块大小是多少?我看到有些人在之前提出的一些问题中提到了 4K 读取。这适用于这种情况吗?

任何帮助表示赞赏。

我的代码摘录如下

我的阅读代码如下

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

其中buf与读取的大小相同。

120*_*arm 2

为了获得最快的读取速度,您需要绕过Windows磁盘缓存。使用 Windows API 调用CreateFileReadFile等并使用无缓冲读取(传递FILE_FLAG_NO_BUFFERINGCreateFile)。这会将数据直接从磁盘传输到您需要的内存块,而无需将数据从一个内存地址复制到另一个内存地址。

您需要密切注意硬件可能强加的内存对齐要求。这通常要求内存地址按 512 字节对齐,但某些较新的硬件可能需要 4096 字节,而其他硬件可能不那么严格。CreateFile文档中的链接提供了FILE_FLAG_NO_BUFFERING.