gpt4 book ai didi

c++ - C++ FileApi.h没有缓存,我如何使磁盘事件达到100%

转载 作者:行者123 更新时间:2023-12-02 10:38:24 25 4
gpt4 key购买 nike

您好,感谢您审查我的问题。

我有一个配置有PCIe RAID0 Controller x16线路的系统,该线路通过m.2连接器分别连接到4个NVMe英特尔驱动器2Tb。
使用 ATTO磁盘基准测试应用程序,文件大小设置为8Gb,块大小设置为2Mb,最大读取速率为〜7Gb / S,同时通过查看任务管理器,在此过程中磁盘 Activity 百分比达到峰值100%。

我的问题:
我使用Qt-Creator和MinGW-64bit编译器开发了一个简单的c++应用程序,使用 FileApi.h header 打开了禁用系统缓存(无缓冲)的文件,并从同一文件读取相同的字节数(2Mb)大小(8Gb)甚至无法接近结果,速率如此之慢〜1.2Gb / S,并且在此过程中磁盘 Activity 约为23%

这是我的代码:

        #include <fileapi.h>

void main()
{
HANDLE dataFile;

dataFile = CreateFileA("File.bin", GENERIC_READ, 0, nullptr,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, nullptr);
FlushFileBuffers(dataFile);
if (dataFile == INVALID_HANDLE_VALUE)
return ;

//Start reading 3000 times from the file
int counter = 0;
while(counter < 3000){
char * buffer = new char [pktSize*sizeof(int)];
unsigned long read;
ReadFile(dataFile, buffer, 2097152 /*2 Megabytes */, &read, nullptr);
counter+=1;
delete[] buffer;
}
}

感谢您的帮助或建议,我们将非常感谢。

最佳答案

在每次迭代中,您都会在内存中分配新的缓冲区。这会导致大量内存通信并降低性能。初始化一次并重用:

char * buffer = new char [pktSize*sizeof(int)];
while(counter < 3000)
{
unsigned long read;
ReadFile(dataFile, buffer, 2097152 /*2 Megabytes */, &read, nullptr);
counter+=1;
}
delete[] buffer;

另外,您还应确保缓冲区大小 pktSize*sizeof(int)大于 2097152 /*2 Megabytes */

关于c++ - C++ FileApi.h没有缓存,我如何使磁盘事件达到100%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58400787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com