gpt4 book ai didi

c++ - 如何使用 C++ 提高在 Windows 上读取数据的速度

转载 作者:行者123 更新时间:2023-11-28 00:28:33 25 4
gpt4 key购买 nike

我正在使用 CreateFile/ReadFile 和 4096 字节的缓冲区大小从卷快照中读取数据 block 。我面临的问题是 ReadFile 太慢了,我能够在 45 秒内读取 68439 个 block ,即 267 Mb,我怎样才能提高速度?以下是我正在使用的部分代码,

block_handle = CreateFile(block_file,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if(block_handle != INVALID_HANDLE_VALUE)
{
DWORD pos = -1;
for(ULONG i = 0; i < 68439; i++)
{
sectorno = (i*8);
distance = sectorno * sectorsize;
phyoff.QuadPart = distance;
if(pos != phyoff.u.LowPart)
{
pos=SetFilePointer(block_handle, phyoff.u.LowPart,&phyoff.u.HighPart,FILE_BEGIN);
if (phyoff.u.LowPart == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR)
{
printf("SetFilePointer Error: %d\n", GetLastError());
phyoff.QuadPart = -1;
return;
}
}
ret = ReadFile(block_handle, data, 4096, &dwRead, 0);
if(ret == FALSE)
{
printf("Error Read");
return;
}
pos += 4096;
}
}

我应该使用 OVERLAPPED 结构吗?或者可能的解决方案是什么?注意:代码没有线程化。

等待积极回应。

最佳答案

我不太确定您为什么为此使用这些极低级别的系统功能。

我个人使用了 C 风格的文件操作(使用 fopen 和 fread)以及 C++ 风格的操作(使用 fstream 和 read,参见 this link)来读取原始二进制文件。从本地磁盘读取速度约为 100MB/秒。

在您的情况下,如果您不想使用标准的 C 或 C++ 文件操作,我的猜测是您的代码变慢的原因是您在每个 block 之后执行查找。您真的需要为每个 block 调用 SetFilePointer 吗?如果 block 是连续的,则不需要执行此操作。

此外,尝试不同的 block 大小,不要害怕超过 1MB。

关于c++ - 如何使用 C++ 提高在 Windows 上读取数据的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23887832/

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