.net 创建数组时SystemOutOfMemoryException

.net 创建数组时SystemOutOfMemoryException,.net,arrays,vb.net,io,.net,Arrays,Vb.net,Io,在创建数组时,我得到一个SystemOutOfMemoryException。然而,我的数组的长度没有超过Int32.MaxValue 这是代码(请不要判断代码,这不是我的代码,至少有7年了) 根据这个问题“”和这个问题“”,最大长度是2147483647个元素或Int32.MaxValue,最大大小是2 GB 因此,我的数组的总长度在限制范围内(3.08亿

在创建数组时,我得到一个
SystemOutOfMemoryException
。然而,我的数组
长度
没有超过
Int32.MaxValue

这是代码(请不要判断代码,这不是我的代码,至少有7年了)

根据这个问题“”和这个问题“”,最大长度是
2147483647个元素或Int32.MaxValue
,最大大小是
2 GB

因此,我的数组的总
长度在限制范围内(3.08亿<20亿),而且
我的大小比显示的2GB(文件大小为298MB)小得多

问题: 那么我的问题是,关于数组,还有什么会导致
MemoryOfMemoryException

注意:对于那些想知道服务器还有10gb可用ram空间的人来说


注2:接下来,我在几次运行中监控了GDI对象的数量。进程本身从不超过1500个对象的计数。

字节数组是一个序列中的字节。这意味着您必须分配如此多的内存,因为您的数组长度在一个块中。如果内存碎片比系统大,即使您有X GB的可用内存,系统也无法分配内存

例如,在我的machyne上,我不能在一个数组中仅分配908 000 000字节,但如果它存储在多个数组中,我可以毫无问题地分配100*90 800 000字节:

// alocation in one array

byte[] toBigArray = new byte[908000000]; //doesn't work (6 zeroes after 908)

// allocation in more arrays
byte[][] a=new byte[100][]; 

for (int i = 0 ; i<a.Length;i++) // it works even there is 10x more memory needed than before
{
    a[0] = new byte[90800000]; // (5 zeroes after 908) 
}
//一个数组中的位置
字节[]toBigArray=新字节[908000000]//不起作用(908后6个零)
//在更多数组中分配
字节[][]a=新字节[100][];

对于(int i=0;i您可以在不首先加载到内存的情况下就地读取/写入数据。只需
System.IO.File。如果不想更改原始文件,请复制该文件

Dim strFilename As String = "C:\Junk\Junk.bmp" 'a big file
Using fs As New FileStream(strFilename, FileMode.Open)
  Dim lngLength As Long = fs.Length
  fs.Seek(lngLength \ 2, SeekOrigin.Begin)
  For l As Long = 0 To lngLength \ 4
    Dim b As Byte = CByte(fs.ReadByte())
    b = Not b
    fs.WriteByte(b)
  Next
End Using
MsgBox("Finished!")

另请参见:

一个
OutOfMemoryException
与数组的长度无关。@TimSchmelter确切地说,它发生在该特定行的原因是什么?你的应用程序中的
数据是什么?@dude将尝试监控GDI对象的数量。我将在这里发布结果。我最近读到了一些类似于at(我的内存分配太大了).数组中的某些东西需要连续的部分内存..我正在尝试以chuncks的形式导入文件。希望这能解决问题是的,扔掉它。你的系统根本无法分配数组…也就是说,你正在将它作为一个整体分配给另一个对象…可能会遇到同样的问题…是的。看起来我在看ng在相当多的代码调整中“叹气”是一个相当有价值的解决方案(因此是upvote)。然而,了解程序的上下文,这将导致相当大的调整。另一方面,Chunking不需要太多的更改(尽管仍然不能低估)。您应该使用一些缓冲区并在块中读取文件,否则它将非常慢。例如,您可以使用BufferedStream包装器
Dim strFilename As String = "C:\Junk\Junk.bmp" 'a big file
Using fs As New FileStream(strFilename, FileMode.Open)
  Dim lngLength As Long = fs.Length
  fs.Seek(lngLength \ 2, SeekOrigin.Begin)
  For l As Long = 0 To lngLength \ 4
    Dim b As Byte = CByte(fs.ReadByte())
    b = Not b
    fs.WriteByte(b)
  Next
End Using
MsgBox("Finished!")