File io 在网络驱动器上快速读取整个文件(Windows、C/C+;+;,C#,…)

File io 在网络驱动器上快速读取整个文件(Windows、C/C+;+;,C#,…),file-io,asynchronous,networking,overlapped-io,File Io,Asynchronous,Networking,Overlapped Io,最近,我在网络驱动器上读取大文件时遇到了问题,我无法确定我可能做错了什么。在C++(非托管)和C语言中,我都尝试过,并且在两个方面都有相同的性能……有点糟糕。 有时它会在网络上以4kb/s的速度读取一个文件,但如果该文件位于本地HD上,它将很容易达到HD可以输出的最大数据速率。也就是说,一次读取64 KB的数据块。。。我试着用更大的缓冲区来达到疯狂的数字,或者用更小的缓冲区,但差别不大 我在C++中尝试了异步IO,在FielestRead上使用了Sead Read和C++中的重叠IO以及同步读取

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

有时它会在网络上以4kb/s的速度读取一个文件,但如果该文件位于本地HD上,它将很容易达到HD可以输出的最大数据速率。也就是说,一次读取64 KB的数据块。。。我试着用更大的缓冲区来达到疯狂的数字,或者用更小的缓冲区,但差别不大

我在C++中尝试了异步IO,在FielestRead上使用了Sead Read和C++中的重叠IO以及同步读取,它们都有相同的问题,在网络上是很慢的。 我们提出的唯一解决方案是在实际读取文件之前,在本地硬盘上使用OS CopyFile功能复制文件,但我对这种方法不太满意。似乎CopyFile正在做一些我们没有做的事情,这使得它比我们的方法快得难以置信


有人知道这是为什么吗?

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

我们不得不猜测,因为您没有向我们显示代码。因此,我猜测Windows file copy正在打开带有标志的文件,这反过来会导致文件系统/缓存选择最佳块大小,并在尚未提交的读取调用之前提交读取请求。

我们只能假设您已经尝试了所有可能的读取/写入方法。你是同步阅读还是异步阅读?您是否尝试了I/O完成端口?还是ReadFileEx()函数?我猜Windows CopyFile()函数检测到您希望从网络读取文件,并将使用与磁盘访问不同的读取方法


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

我们只能假设你已经尝试了所有可能的阅读/写作方法。你是同步阅读还是异步阅读?您是否尝试了I/O完成端口?还是ReadFileEx()函数?我猜Windows CopyFile()函数检测到您希望从网络读取文件,并将使用与磁盘访问不同的读取方法


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

谢谢,但不幸的是,即使有了这个标志,Win32 CopyFile函数仍然比我使用CreateFile和ReadFile所能想到的任何东西都要快。。。我做了一个小的基准测试,尝试了打开文件时可以设置的所有标志,但仍然无法使其与CopyFile一样快(即使没有向本地HD写入任何内容!)我不确定CopyFile中发生了什么,我们无法复制。在本地硬盘上读取文件总是很快,但不是在网络驱动器上,而在这两种情况下CopyFile都很快。谢谢,但不幸的是,即使有了这个标志,Win32 CopyFile函数仍然比我使用CreateFile和ReadFile能想到的任何东西都要快。。。我做了一个小的基准测试,尝试了打开文件时可以设置的所有标志,但仍然无法使其与CopyFile一样快(即使没有向本地HD写入任何内容!)我不确定CopyFile中发生了什么,我们无法复制。在本地硬盘上读取文件总是很快,但不是在网络驱动器上,而在这两种情况下CopyFile都很快。