最近我在阅读网络驱动器上的大文件时遇到了问题,而我无法确定我可能做错了什么。我在C ++(Unmanaged)和C#中都尝试过,并且在两者上都有相同的表现......这有点糟糕。
有时它会以4 KB / s的速度读取网络上的文件,但如果此文件位于本地HD上,它将轻松实现HD可输出的最大数据速率。这是一次读取64 KB的块...我尝试使用更大的缓冲区,直到疯狂的数字,或更小,并没有太大的差异。
我在C#中使用BeginRead和C ++中的OVERLAPPED IO以及同步读取尝试了异步IO,它们都有相同的问题,这在网络上很慢。
我们提出的唯一解决方案是在实际读取文件之前使用本地HD上的OS CopyFile函数复制文件,但我对这种方法不太满意。看起来像CopyFile正在做的事情我们不是让它比我们的方法快得多。
任何人都知道为什么会这样?
答案 0 :(得分:0)
我们必须猜测,因为您没有向我们展示您的代码。所以我的猜测是Windows文件副本正在打开带有FILE_FLAG_SEQUENTIAL_SCAN标志的文件,这反过来导致文件系统/缓存选择最佳的块大小并提交读取请求以预期尚未提交的读取调用
答案 1 :(得分:0)
我们只能假设你一直在尝试所有可能的阅读/写作方法。您是同步还是异步阅读?你尝试过I / O完成端口吗?还是ReadFileEx()函数?我猜想Windows CopyFile()函数检测到你想要从网络读取文件,并使用不同的方法进行读取,然后用于磁盘访问。
如果你真的已经用尽所有可能的阅读方法,如果你真的需要解决的问题,那么我建议你查看一下CopyFile()函数的作用。有很多工具可以做到这一点。例如:this one(或其他一些 - 同一页面上的链接)。