繁体   English   中英

通过fread / fwrite将文件复制到USB的性能

[英]Performance of copying a file with fread/fwrite to USB

我在一段代码的前面,该代码将文件复制到USB设备。 以下部分是重要的部分:

while((bytesRead = fread(buf, 1, 16*1024, m_hSource)) && !bAbort) {
    // write to target
    long bytesWritten = fwrite(buf, 1, bytesRead, m_hTarget);

    m_lBytesCopied += bytesWritten;

客户说这件事,与正常的pc <-> usb速度相比,它相当慢。 我没有编写代码,所以优化是我的工作。

所以我想知道,这是一个更好的方法,首先读取完整的文件,然后一步一步写入文件。 但是我不知道这将是多么容易出错。 该代码还会在每个复制步骤之后检查所有字节是否均已正确写入,从而也可能减慢该过程。

我不是那个c ++和硬件专家,所以我问你们,我如何才能加快速度并保持复制成功。

  1. 尝试大块读写 16M,32M​​可以复制文件。
  2. 如果您只想复制文件,则可以随时调用system()它将更快。
  3. 该代码还会在每个复制步骤之后检查所有字节是否均已正确写入,从而也可能减慢该过程。

    您可以通过创建更大块的哈希来检查它。 就像将文件分割成64M的块一样。 然后匹配这些块的哈希值。 Bittorrent协议具有此功能。

  4. 如果您有mmapMapViewOfFile可用,请先映射文件 然后将其写入USB。 这种读取操作将由内核处理

  5. Kerrek刚刚评论了在mmap上使用memcpy情况。 具有2个mmap ed文件的memcpy看起来很棒。

另请注意,最新的操作系统在被删除时会写入USB记忆棒。 在删除之前,它只是将数据写入缓存中。 因此从OS复制可能会更快。

那重叠的读写呢?

在当前代码中,总时间为time(read original) + time(write copy) ,如果您读取了第一个块,则在写入时开始读取第二个块,依此类推。总时间为max(time(read original), time(write copy)) (加上读/写不会流水线的第一个和最后一个块的时间)。

如果读写几乎同时花费了一半的时间。

您可以使用两个线程或异步IO来实现。 不幸的是,线程和异步IO依赖于平台,因此您必须检查系统手册或选择适当的可移植库。

我将只使用某些特定于OS的功能,这些功能肯定比仅使用c / c ++函数编写的功能要快。

对于Linux,这可以是sendfile函数。 对于Windows, CopyFile将完成此工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM