【问题标题】:saving file to network将文件保存到网络
【发布时间】:2009-05-21 17:42:41
【问题描述】:

我有一个大约 7 MB 的文件,可以在几秒钟内保存到我的本地共享中。但是,将该文件保存到网络位置需要 分钟。我想知道我能做些什么来加快这个速度。以下是我目前的选择:

  1. 将数据保存到本地计算机上的临时文件,然后将临时文件复制到网络路径。我可能会这样做,因为这是最简单且最划算的方法。
  2. 使用SetFilePointerEx()SetEndOfFile()。根据这个问题的答案,我认为这可能很有用:Creating big file on Windows
  3. 缓冲区写入。我可以自己缓存写入数据并在缓冲区已满时刷新,但这与操作系统已经完成的缓存不是多余的吗?

#1 似乎是最好的选择,但我想知道是否有人对加快保存到网络路径的更好方法有任何建议?

编辑: 网络位于千兆 LAN 上,因此速度应该不是问题。将文件复制到网络路径大约需要 1 秒。我刚刚注意到我们在较小的数据块上调用 WriteFile() ,然后我们可能应该这样做,因此优化更高级别的代码以编写更大的块可能会有所帮助,但速度差异仍然如此显着,以至于它仍然是一个值得提出的问题.

【问题讨论】:

  • 如果复制文件需要一秒钟,那么也许您应该使用 CopyFile 或 CopyFileEx 函数,或者调用复制命令。

标签: c++ windows file-io createfile writefile


【解决方案1】:

我想知道是否有人对加快保存到网络路径的更好方法有任何建议?

也许您需要更好的网络。 ISP 通常提供快速下载但缓慢上传。使用 FTP 等协议传输 7 MB 需要多长时间?

【讨论】:

    【解决方案2】:

    您需要避免读取-修改-写入操作。您通常希望写入至少 4KB 的块,可能是 2 的更高次方。原因是要附加一个字节,您通常需要读取文件的最后一个块,附加一个字节,然后写回新块.通过(仅)写入 4KB 块,每次写入通常都会在文件末尾作为一个新块结束。

    缓存在这里应该可以帮助您,但缓存并不完美。以独占方式打开文件可能会有所帮助。如果您拒绝读取访问权限,操作系统可能会注意到刷新缓存对其他应用来说并不是太重要。

    CopyFile 可以很快,因为它可以做的完全一样。

    【讨论】:

    • 好点,虽然我已经打开了一个具有独占访问权限的文件进行写入(使用 dwShareMode==0 调用 CreateFile())。
    【解决方案3】:

    您是否在慢速网络上运行?

    使用选项号 1 并在后台将文件保存到网络共享

    【讨论】:

      猜你喜欢
      • 2012-08-17
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      相关资源
      最近更新 更多