2

最近我在读取网络驱动器上的大文件时遇到问题,我无法确定我可能做错了什么。我在 C++(非托管)和 C# 中都进行了尝试,并且两者的性能大致相同......这有点糟糕。

有时它会在网络上以 4 KB/sa 的速度读取文件,但如果该文件位于本地 HD 上,它将轻松实现 HD 可以输出的最大数据速率。那就是一次读取 64 KB 的块......我尝试使用更大的缓冲区,直到疯狂的数字,或者更小,它并没有太大的区别。

我在 C# 中尝试使用 FileStream 上的 BeginRead 和 C++ 中的 OVERLAPPED IO 的异步 IO 以及同步读取,它们都有相同的问题,这在网络上很慢。

我们想出的唯一解决方案是在实际读取文件之前使用本地 HD 上的 OS CopyFile 功能复制文件,但我对这种方法不太满意。看起来 CopyFile 正在做一些我们没有做的事情,这使得它比我们的方法快得多。

任何人都知道这是为什么?

4

2 回答 2

0

我们不得不猜测,因为您没有向我们展示您的代码。所以我的猜测是 Windows 文件副本正在打开带有FILE_FLAG_SEQUENTIAL_SCAN标志的文件,这反过来会导致文件系统/缓存选择最佳块大小并提交读取请求,以预期尚未提交的读取调用。

于 2010-02-26T01:19:00.893 回答
0

我们只能假设您一直在尝试所有可能的读/写方法。你是同步阅读还是异步阅读?您是否尝试过 I/O 完成端口?还是 ReadFileEx() 函数?我猜想 Windows CopyFile() 函数检测到您想从网络读取文件,并将使用不同的方法进行读取,然后用于磁盘访问。

如果您真的用尽了所有可能的阅读方法,并且您确实需要解决问题,那么我建议您检查一下 CopyFile() 函数的作用。有很多工具可以做到这一点。例如:这个(或其他一些——同一页面上的链接)。

于 2010-03-22T08:56:31.713 回答