Byte[流.-内存异常,最好的解决方法

本文关键字:解决 方法 异常 内存 Byte | 更新日期: 2023-09-27 18:08:10

我正在尝试从文件中读取字节流。然而,当我试图读取字节时,我得到一个

由于内存不足,函数求值被禁用除了

非常简单。然而,解决这个问题的最佳方法是什么?它一次绕1028圈是不是太长了?还是有更好的办法?

我正在使用的c#

BinaryReader br = new BinaryReader(stream fs);
// The length is around 600000000
long Length = fs.Length;
// Error here
bytes = new byte[Length];
for (int i = 0; i < Length; i++)
{
   bytes [i] = br.ReadByte();
}

谢谢

Byte[流.-内存异常,最好的解决方法

好吧。首先。假设有一个大小为2GB的文件。您的代码将分配2GB的内存。只读取文件中你真正需要的部分,而不是一次读取整个文件。第二:不要这样做:

for (int i = 0; i < Length; i++)
{
   bytes [i] = br.ReadByte();
}

效率很低。要读取流的原始字节,您应该使用如下命令:

using(var stream = File.OpenRead(filename))
{
    int bytesToRead = 1234;
    byte[] buffer = new byte[bytesToRead];
    int read = stream.Read(buffer, 0, buffer.Length);
    //do something with the read data ... e.g.:
    for(int i = 0; i < read; i++)
    {
        //...
    }
}

当您尝试分配一个数组时,CLR将它连续地放在操作系统给它的虚拟内存中。但是,虚拟内存可以被分割,因此一个连续的1 GB块可能不可用,因此出现了OutOfMemoryException。不管你的机器有多少物理内存,这个问题并不局限于托管代码(尝试在本机C中分配一个巨大的数组,你会发现类似的结果)。

比起分配一个巨大的数组,我建议使用几个较小的数组,一个ArrayList或List,这样框架可以分配数据块。

希望有帮助

我相信流对象的实例化已经读取了文件(到缓存中)。然后循环将内存中的字节复制到另一个数组。

那么,为什么不使用数据到"br",而不是做进一步的复制?