2013-11-29 49 views
-1

我正在使用GB的当前使用单线程备份VHD。我想减少阅读/写在C++中的时间。现在我想使用多个线程,每个线程将读取一个细分块并在输出文件的相同位置写入,而不会有线程写入同一个地方。 我已经完成了阅读文件的第一部分使用多个线程使用多个std::ifstream,现在我想减少写入时间,但我不能使用多个std::ofstream,使用单个ofstream & Mutex我没有得到一个好的结果,因为我期望... .Plz帮助...快速读取/写入大数据的方法

回答

2

最可能出现错误的原因是您打开文件进行独占访问。如果您希望多个编写者使用单个文件,则必须指定文件共享选项。

使用多个读写线程不会加快速度。你的瓶颈是磁盘,一次只能做一件事。使用多线程会降低速度,因为会有不必要的磁盘查找。

为什么你正在编写一个C++程序来做VHD备份有点神秘。您可以使用COPY或ROBOCOPY或下载并使用Fastcopy,这是我在Windows上使用的最快的文件复制程序。

如果你真的想编写自己的复制程序,可以用两个线程来完成:一个用于读取,另一个用于写入。它的工作原理是这样的:

Read the first block 
while not end of input 
    Make an asynchronous call to start writing the block 
    Read the next block 
    wait for the asynchronous write to complete 
end 

请注意,这不会提高你的表现,如果输入和输出文件都在同一个物理磁盘上。如果源和目标位于同一个驱动器上,则多个线程根本无法帮助您。

+0

谢谢,但我正在阅读VMWare Esxi服务器上的VM的VHD,并且写入Linux系统将COPY或ROBOCOPY或下载将它工作,因为我正在使用VDDK api @ Jim Mischel读取数据 – Dipak

+0

@Dipak: m不熟悉Linux或VMWare的任何特殊工具。 –

+0

:谢谢,让我知道如何提高性能。 – Dipak

相关问题