【问题标题】:Performance issues using Copyfile() to copy files from different computers使用 Copyfile() 从不同计算机复制文件的性能问题
【发布时间】:2010-10-08 00:32:53
【问题描述】:

使用 VC++ VisualStudio 2003。

我正在尝试将多个图像文件(每个文件 30kb 左右)从另一台计算机的共享文件夹复制到本地文件。

问题是一次传输可以有超过2000个左右的文件,而且看起来 付出代价,大大花费更多时间来完成。

是否有任何替代方法可以从另一台计算机复制文件? 加快复制速度?

提前致谢。

编辑* 由于客户要求,无法大幅更改代码库, 讨厌因为非技术问题而不得不偏离最佳实践, 但有更微妙的方法吗?比如另一个函数调用?

我知道我在要求一些神奇的巫术,以防万一有人知道。

【问题讨论】:

    标签: performance visual-c++ mfc file-copying


    【解决方案1】:

    嗯,首先,2000 年不是几个。如果大部分时间是因为您要发送大量小文件,那么您会想出一个解决方案,将它们在源端打包成一个文件,然后在目标端将它们解包。这将需要在源代码处运行一些代码 - 您必须设计解决方案以允许这样做,因为我假设您目前只是从网络共享复制。

    如果是网络速度(不太可能),你也可以压缩它们。

    我自己的信念是文件的数量,基本上是副本的所有重复启动成本。这是因为 2000 个 30K 文件只有 60MB,而在 10Mb 链接上,理论上最短时间约为一分钟。

    如果你的时间大大超过这个,那么我会说我是对的。

    使用 7zip 或类似的解决方案将它们全部压缩到一个 7z 文件,传输它们,然后在另一端解压缩它们听起来就像您正在寻找的那样。

    但要衡量,不要猜测!测试一下,看看它是否能提高性能。然后做出决定。

    【讨论】:

    • 感谢您的建议。它不是文件大小,归档方法似乎很理想
    【解决方案2】:

    有几件事可以尝试:

    • 使用操作系统复制文件是否更快?

    • 如果不是,那么您的网络或其设置方式可能存在一些固有限制(可能是身份验证问题,或者远程服务器有一些硬件问题,或者它太忙,或者网卡丢失太多由于冲突、开关故障、接线不良...)

    • 进行一些测试以传输各种大小的文件。
      小文件的传输总是较慢,因为获取它们的详细信息、传输数据、创建目录条目等需要大量开销。

    • 如果大文件速度很快,那么您的网络还可以,您可能无法对系统进行太多改进(瓶颈在其他地方)。

    • 最终,从代码中,您可以尝试打开文件,一次将文件读入一个大缓冲区,然后将它们保存在本地驱动器上。这可能会更快,因为您将绕过操作系统内部执行的大量检查。

    • 您甚至可以通过几个线程同时打开、加载、写入文件以加快速度。

    您可以检查多线程文件副本的几个参考:

    如果您自己在代码中实现这一点太麻烦,您总是可以简单地在应用程序的后台执行一个像 McTool 这样的实用程序,让它为您完成工作。

    【讨论】:

    • 是的,使用操作系统进行复制更快。感谢您的建议,将研究多线程方法
    猜你喜欢
    • 2018-09-06
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    相关资源
    最近更新 更多