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

标签 c++ windows performance file-io block

我正在使用 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/

相关文章:

c++ - 在 Windows 中使用 PTHREAD 互斥?

c++ - OpenCV:如何使用掩码参数进行特征点检测(SURF)

c++ - 当应用程序菜单具有焦点时,消息循环被阻塞

.NET运行时优化服务

java - 如何将 selenium Web 驱动程序打开的浏览器窗口置于前面

javascript - Angular 2 : Enhance the performance of scroll event with a big ngFor List

c++ - 无法遍历 boost 无序 HashMap

c++ - 如何给一个类作为 printf 的有效参数,它以字符串形式返回?

c# - C# HashSet 快速获取随机元素

c++ - STL 容器性能概述