【发布时间】:2017-06-19 03:05:42
【问题描述】:
我正在使用 Windows 10 64 位机器、6850K CPU 和 64 GB DDR4 RAM,并通过 M.2 连接三星 SSD。我想将一个大小约为 15 GB 的文件读入内存。我目前正在使用 fstream 将整个文件读入一个无符号字符数组,只需一次调用其读取函数。但是,我实现的速度并未达到 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);
其中buf 与读取的大小相同。
【问题讨论】:
-
您是否尝试过使用
mmap()?避免不必要的复制可能会更快。 -
@Richard 我添加了代码。 SSD 连接到 M.2 插槽。运行 Crystal Mark 确实提供了 ~3500 MB/s 作为读取速度。也是。
-
不要回避你不熟悉的东西!你将如何学习?
-
要获得最快的读取速度,需要绕过windows磁盘缓存。使用 Windows API 调用
CreateFile、ReadFile等并使用无缓冲读取(将FILE_FLAG_NO_BUFFERING传递给CreateFile,并密切注意所需的内存对齐必要性)。这会将数据直接从磁盘传输到您需要的内存块,而无需将数据从一个内存地址复制到另一个。 -
可能有硬件对地址的要求,通常是 512 字节对齐,但一些较新的硬件可能需要 4096 字节。其他人可能没有那么严格。
CreateFile文档中的链接提供了FILE_FLAG_NO_BUFFERING的完整详细信息。