从C#中的巨大MemoryStream中读取

Man*_*oon 6 c# memorystream bytearray

我使用BinaryReader(MemoryStream(MyByteArray))来读取可变大小的记录并在内存中处理它们.只要数组中的字节流大小小于约1.7 GB,这就可以正常工作.之后(这是我的64位系统中整数的最大大小)你不能创建一个更大的bytearray,虽然我有足够的实内存.所以我的解决方案是读取字节流并将其拆分成几个字节数组.

然而,现在我不能"读取"字节数组边界,并且,由于我的数据是可变格式,我无法确保字节数组总是在整个记录上完成.

对于处理非常大的数据集并且仍然需要速度的人来说,这必然是一个常见问题.

我该如何处理这个问题?

Ras*_*ber 4

编辑:阅读基础知识后,我意识到内存映射文件可能比顺序访问的普通 I/O 慢。

你有没有尝试过这样的事情:

var stream = new FileStream("data", 
    FileMode.Open, 
    FileAccess.Read, 
    FileShare.Read, 
    16 * 1024, 
    FileOptions.SequentialScan)

var reader = new BinaryReader(stream);
Run Code Online (Sandbox Code Playgroud)

如果您的数据驻留在文件中并且您可以使用 .NET 4.0,请考虑使用MemoryMappedFile.

然后,您可以使用 aMemoryMappedViewStream来获取流,或者使用 aMemoryMappedViewAccessor来获取BinaryReader类似的接口。