我使用BinaryReader(MemoryStream(MyByteArray)
)来读取可变大小的记录并在内存中处理它们。只要数组中的字节流大小小于约1.7 GB,这就可以正常工作。之后(这是我的64位系统中整数的最大大小)你不能创建一个更大的bytearray,虽然我有足够的实内存。所以我的解决方案是读取字节流并将其拆分成几个字节数组。
然而,现在,我不能“读取”字节数组边界,并且,由于我的数据是可变格式,我无法确保字节数组总是在整个记录上完成。
这对于处理非常大的数据集的人来说一定是一个常见的问题,但仍然需要速度。
我该如何处理这个问题?
答案 0 :(得分: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
。
然后,您可以使用 MemoryMappedViewStream
获取流,也可以使用MemoryMappedViewAccessor
获取类似BinaryReader
的界面。
答案 1 :(得分:2)
对于过大的流,您不应尝试在MemoryStream
中转储它 - 改为使用FileStream
之类的内容,直接与磁盘通信。内置缓冲通常就足够了,或者你可以用BufferedStream
之类的东西调整它(但我很少需要 - 但是,我倾向于包含我自己的数据处理缓冲区)。
您可能还会考虑压缩或密集数据以及序列化工具等设计用于流式记录的工作,而不是一次创建整个图表(尽管您提到BinaryReader
,可能已经高度手动执行此操作,因此这可能不是问题。)