C# 用C语言从巨大的内存流中读取#

C# 用C语言从巨大的内存流中读取#,c#,bytearray,memorystream,C#,Bytearray,Memorystream,我使用BinaryReader(MemoryStream(MyByteArray))读取可变大小的记录并在内存中处理它们。只要阵列中的ByTestStream的大小小于约1.7GB,这种方法就可以正常工作。在这之后(这是我的64位系统中整数的最大大小),您不能创建更大的bytearray,尽管我有足够的实际内存。因此,我的解决方案是读取ByTestStream并将其拆分为几个字节数组 然而,现在我无法跨越字节数组边界“读取”,而且,由于我的数据是可变格式的,我无法确保字节数组始终在整个记录上完成

我使用BinaryReader(
MemoryStream(MyByteArray)
)读取可变大小的记录并在内存中处理它们。只要阵列中的ByTestStream的大小小于约1.7GB,这种方法就可以正常工作。在这之后(这是我的64位系统中整数的最大大小),您不能创建更大的bytearray,尽管我有足够的实际内存。因此,我的解决方案是读取ByTestStream并将其拆分为几个字节数组

然而,现在我无法跨越字节数组边界“读取”,而且,由于我的数据是可变格式的,我无法确保字节数组始终在整个记录上完成

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


如何处理此问题?

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

你有没有试过这样的方法:

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

var reader = new BinaryReader(stream);

如果你的数据驻留在一个文件中,你可以使用.NET 4考虑使用.< /P> 然后,您可以使用获取流或使用获取类似于的BinaryReader接口。


对于过大的流,您不应该尝试将其转储到
内存流
——而是使用
文件流
之类的方式,直接与磁盘对话。内置的缓冲通常是足够的,或者你可以用
BufferedStream
之类的东西来调整它(但我很少需要这样做,但是我倾向于包含我自己的数据处理缓冲)


您也可以考虑压缩或密集打包的数据,以及串行化器,它是通过流式记录而不是一次创建一个完整的图形来工作的(尽管您提到了<代码> BinaryReader <代码>,您可能已经手动地做了这件事,所以这可能不是问题)。我试过了——不幸的是,内存文件确实非常慢。是的。它被有效地压缩,我用自己的逻辑将其非序列化。但是从磁盘读取太慢了。所有-我对这个巨大的数据文件使用并行处理,并将其存储在磁盘上,这会引起各种各样的争用。使用memoryStrea,所有在内存中-对我来说非常适合-除了现在我的数据已经超过了bytearray的任意最大大小。我希望你先阅读完300封电子邮件,否则就没有甜点了@ManInMoon-然后(同时考虑到您对内存映射文件的评论),您必须将数据拆分为多字节数组,然后编写自己的内存支持流实现,或者在允许多个独立内存流的适当点拆分数据。@MrWuf实际上取决于大小;您应该能够按块顺序访问映射文件,而不必将很大一部分加载到内存流中;根据您的想法,您应该首先防止将这种大小的字节数组加载到内存中。难道不可能实现只将阵列的一部分加载到内存(缓冲区)中的流式解决方案吗?您需要随机访问这些字节吗?或者,您可以使用仅向前的解决方案,在处理流的过程中从头到尾读取流(并且不回头)。这个字节数组来自哪里?一个文件,一个web服务。。。?