首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用c++读取大文件的固态硬盘

使用c++读取大文件的固态硬盘
EN

Stack Overflow用户
提问于 2017-06-19 11:05:42
回答 1查看 819关注 0票数 5

我在一台Windows10 64位机器上工作,6850K中央处理器,64 GB DDR4内存,三星固态硬盘通过M.2连接。我想读取一个大小约为15 GB的文件到内存中。我目前使用fstream将整个文件读入到一个无符号字符数组中,只需调用它的read函数即可。但是,我达到的速度没有达到SSD的最大读取速度(当SSD读取速度约为3500 MB/s时,读取速度为1500 MB/s)。

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

任何帮助都是非常感谢的。

我的代码摘录如下

我的阅读代码如下

代码语言:javascript
复制
fstream myFile;
myFile.open("file", ios::binary | ios::in);
myFile.read(reinterpret_cast<char*>(buf), 14929920000LL); 

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-21 08:07:43

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

您需要密切关注可能由硬件强加的内存对齐需求。这通常要求内存地址是512字节对齐的,但一些较新的硬件可能需要4096字节,而其他硬件可能不那么严格。CreateFile文档中的链接提供了FILE_FLAG_NO_BUFFERING的完整详细信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44621693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档