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

C++ 使用c+;读取大文件的SSD+;,c++,file,C++,File,我在一台Windows10 64位机器上工作,6850K CPU,64 GB DDR4 RAM,三星SSD通过M.2连接。我想把一个大约15GB大小的文件读到内存中。我目前正在使用fstream,通过对其read函数的一次调用,将整个文件读入一个无符号字符数组。但是,我实现的速度没有达到SSD的最大读取速度(当SSD读取速度约为3500 MB/s时为1500 MB/s) 所以我想知道是否有更快的方法?如果我对较小的块进行多次读取调用,会更快吗?如果是这样,那么最佳块大小是多少?我看到一些人在之前

我在一台Windows10 64位机器上工作,6850K CPU,64 GB DDR4 RAM,三星SSD通过M.2连接。我想把一个大约15GB大小的文件读到内存中。我目前正在使用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); 
我的阅读代码如下

fstream myFile;
myFile.open("file", ios::binary | ios::in);
myFile.read(reinterpret_cast<char*>(buf), 14929920000LL); 
fstream-myFile;
打开(“文件”,ios::binary | ios::in);
myFile.read(reinterpret_cast(buf),149299220000ll);

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

要获得最快的读取速度,需要绕过windows磁盘缓存。使用Windows API调用
CreateFile
ReadFile
等,并使用非缓冲读取(将
FILE\u FLAG\u NO\u缓冲传递到
CreateFile
)。这将直接将数据从磁盘传输到所需的内存块,而无需将数据从一个内存地址复制到另一个内存地址


您需要密切关注硬件可能带来的内存对齐需求。这通常要求内存地址为512字节对齐,但一些较新的硬件可能需要4096字节,而其他硬件可能没有这么严格。文档中的一个链接提供了
FILE\u FLAG\u NO\u BUFFERING

的完整详细信息。您是否尝试过使用
mmap()
?避免不必要的复制可能会更快。@Richard I添加了代码。SSD连接到M.2插槽。运行Crystal Mark时,读取速度约为3500 MB/s。还有,不要回避你不熟悉的事情!您将如何学习?要获得最快的读取速度,您需要绕过windows磁盘缓存。使用Windows API调用
CreateFile
ReadFile
等,并使用非缓冲读取(将
FILE\u FLAG\u NO\u BUFFERING
传递到
CreateFile
,并密切注意所需的内存对齐需求)。这将直接将数据从磁盘传输到所需的内存块,而无需将数据从一个内存地址复制到另一个内存地址。可能对地址有硬件强制要求,通常为512字节对齐,但一些较新的硬件可能需要4096字节。其他人可能没有那么严格。文档中的链接提供了
文件\u标志\u否\u缓冲的完整详细信息。