读取和写入一个大文件,而不是一个小块的磁盘一次的缺点?

我主要在基于Windows和Windows CE的系统上工作,其中CreateFileReadFileWriteFile是工作马,无论是在本地Win32域还是在托pipe的.Net域中。

到目前为止,我一直没有任何明显的问题写或读大块文件,而不是循环,直到处理几个较小的块。 我通常将IO工作委托给后台线程,在完成时通知我。

但是看看文件IO教程或“教科书示例”,我经常会发现“小块循环”,而没有解释为什么它被使用,而不是更明显(我敢说!)“一次完成”。

我有什么缺点,我没有明白?

澄清:

通过大文件,我比较了我的单块与多个块。 我提到的多个块的例子通常在Windows CE上有1024个字节的大小,在桌面上有10个大小。 我的大文件通常是二进制文件,如手机等相机的照片,大小顺序为2-10 MB。 换句话说,不接近1 GB。

Solutions Collecting From Web of "读取和写入一个大文件,而不是一个小块的磁盘一次的缺点?"

一般来说,你不应该假定一个流将一次读取所有的数据。 虽然本地文件可能是真的,它可能不适用于网络文件…它绝对不会工作的普通网络流,除非更高的水平已经缓冲了他们。

那么就有记忆的问题:假设有人要求你处理一个3GB的文件。 如果你流式处理,一次处理一个块,你没有问题。 如果你试图把整个事情读入记忆中,你不可能成功。

一般来说:如果你可以流式传输,那就去做吧。 为什么你想要使用一个不太可靠和效率较低的方法? 对于任何形式的健壮性,你仍然需要检查Read的返回值,并将其与您期望读取的内容进行比较…所以添加一个循环不会导致非常复杂。 另外,如果你发现自己做了很多事情,你可能会发现你可以封装到辅助方法中的模式,很可能会让代表来表示正在处理的自定义操作。

这取决于你的“大”的定义。 如果您只有2 GB的RAM(不包括虚拟内存),请将10 GB文件读入内存。

所以,一般来说,你总是需要做分块。 这可能是为什么教科书如此喜欢它。 这只是大块的大小,这是一个讨论点。

在处理流时,组块的另一个优点是内存使用率保持较低,并且与输入大小无关。

但是,如果( 且仅当 )知道文件大小有一些上限,并且RAM的下限有限,则可以一次完成所有操作。