6

我使用 BinaryReader ( MemoryStream(MyByteArray)) 读取可变大小的记录并在内存中处理它们。只要我在数组中的字节流大小小于 1.7 GB,这就会很好地工作。之后(这是我的 64 位系统中整数的最大大小),尽管我有足够的实际内存,但您无法创建更大的字节数组。所以我的解决方案是读取字节流并将其拆分为几个字节数组。

但是,现在我无法“读取”字节数组边界,并且由于我的数据是可变格式,我无法确保字节数组总是在整个记录上完成。

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

我该如何处理这个问题?

4

2 回答 2

4

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

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

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

var reader = new BinaryReader(stream);

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

然后,您可以使用 aMemoryMappedViewStream获取流或使用 aMemoryMappedViewAccessor获取BinaryReader-like 接口。

于 2010-09-06T11:56:00.717 回答
3

对于过大的流,您不应该尝试将其转储MemoryStream- 使用类似的东西FileStream,并直接与磁盘对话。内置的缓冲通常就足够了,或者你可以用类似的东西来调整它BufferedStream(但我很少需要 - 但是我倾向于包含我自己的数据处理缓冲区)。

您可能还会考虑诸如压缩或密集打包数据之类的事情,以及旨在通过流式记录而不是一次创建整个图形来工作的序列化程序(尽管由于您提到BinaryReader,您可能已经在高度手动执行此操作,因此这可能不是问题)。

于 2010-09-06T12:06:22.800 回答