我正在接收一个文件作为字节 [] 数据包流(预先不知道总大小),我需要将其存储在某个地方,然后在收到它后立即处理它(我不能即时进行处理)。接收到的文件总大小可以从小到 10 KB 到超过 4 GB 不等。
- 存储接收到的数据的一个选项是使用一个
MemoryStream
,即一系列MemoryStream.Write(bufferReceived, 0, count)
调用来存储接收到的数据包。这很简单,但显然会导致大文件出现内存不足异常。 - 另一种选择是使用 a
FileStream
,即FileStream.Write(bufferReceived, 0, count)
。这样,不会发生内存不足异常,但我不确定是由于磁盘写入导致的性能不佳(只要仍有足够的内存可用,我不希望发生这种情况) - 我想尽可能避免磁盘访问,但我不知道如何控制它。
MemoryStream.Write()
我做了一些测试,在大多数情况下,说 10 000 次连续调用vs之间似乎几乎没有性能差异FileStream.Write()
,但很大程度上取决于缓冲区大小和有问题的数据总量(即写入次数) . 显然,MemoryStream
尺寸重新分配也是一个因素。
MemoryStream
使用and的组合是否有意义FileStream
,即默认写入内存流,但是一旦接收到的数据总量超过例如 500 MB,将其写入FileStream
;然后,从两个流中读取块以处理接收到的数据(首先从 500 MBMemoryStream
处理,处理它,然后从 读取FileStream
)?另一种解决方案是使用自定义的内存流实现,它不需要连续的地址空间来进行内部数组分配(即内存流的链表);这样,至少在 64 位环境中,内存不足异常应该不再是问题。缺点:额外的工作,更多的错误空间。
那么FileStream
vsMemoryStream
读/写在磁盘访问和内存缓存方面如何表现,即数据大小/性能平衡。我希望只要有足够的 RAM 可用,FileStream
无论如何都会在内部从内存(缓存)读取/写入,而虚拟内存将负责其余的工作。FileStream
但是我不知道在写入磁盘时会多久显式访问一次。
任何帮助,将不胜感激。