【问题标题】:SSD read for a large file using c++使用 C++ 读取大文件的 SSD
【发布时间】: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 调用CreateFileReadFile 等并使用无缓冲读取(将FILE_FLAG_NO_BUFFERING 传递给CreateFile,并密切注意所需的内存对齐必要性)。这会将数据直接从磁盘传输到您需要的内存块,而无需将数据从一个内存地址复制到另一个。
  • 可能有硬件对地址的要求,通常是 512 字节对齐,但一些较新的硬件可能需要 4096 字节。其他人可能没有那么严格。 CreateFile 文档中的链接提供了 FILE_FLAG_NO_BUFFERING 的完整详细信息。

标签: c++ file


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2010-09-22
    • 2023-03-17
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    相关资源
    最近更新 更多