【发布时间】:2014-07-16 06:32:31
【问题描述】:
我正在使用CreateFile/ReadFile 和 4096 字节的缓冲区大小从卷快照中读取数据块。
我面临的问题是ReadFile 太慢了,我可以在 45 秒内读取 68439 个块,即 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 结构吗?或者可能的解决方案是什么?
注意:代码没有线程化。
等待积极的回应。
【问题讨论】:
-
我看到循环目前基本上什么都不做 - 您读取的数据没有用于任何事情。这使我认为您省略了可能对答案很重要的代码。我的直接想法是(a)你的分析器告诉你什么? (b) 这与仅分析发布的代码时的结果有显着不同吗? (c) 那么内存映射文件访问呢,你调查过吗?最后,这段代码中
sectorSize的典型值是什么? -
@enhzflep:是的,我省略了其他代码,它只是将数据转储到另一个卷中。但我需要先测试速度,在我的实际代码中,我也注释了这些行并只测试了上面的代码。我没有尝试过内存映射文件访问,因为我不知道文件名,所以从块/集群中读取数据是否有用。扇区大小为 512。
-
我仍然想知道为什么您似乎没有通过分析器运行代码!? (mingw & VS 自带)这将告诉你代码的哪一部分出现了瓶颈。 - 不确定内存映射文件的来龙去脉,快速检查 MSDN 表明
CreateFileMapping采用HANDLE,这是从对CreateFile的调用中返回的。这些可能会有所帮助:1 msdn.microsoft.com/en-au/library/ms810613.aspx 2 msdn.microsoft.com/en-us/library/windows/desktop/… 3 msdn.microsoft.com/en-us/library/windows/desktop/… -
对于扇区大小-您的示例显示了数据的顺序访问。如果(读取的最后位置 + 4096 字节)==(读取的新位置),则不执行查找操作。
标签: c++ windows performance file-io block