创建数组时出现系统OutOfMemoryException

时间:2014-08-07 11:18:34

标签: .net arrays vb.net io

创建数组时我得到SystemOutOfMemoryException。然而,我的数组length的{​​{1}}超过does not

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

Int32.MaxValue

根据此问题“SO Max Size of .Net Arrays”和此问题“Maximum lenght of an array”,最大长度为Dim myFileToUpload As New IO.FileInfo(IO.Path.Combine(m_Path, filename)) Dim myFileStream As IO.FileStream Try myFileStream = myFileToUpload.OpenRead Dim bytes As Long = myFileStream.Length //(Length is roughly 308 million) If bytes > 0 Then Dim data(bytes - 1) As Byte // OutOfMemoryException is caught here myFileStream.Read(data, 0, bytes) objInfo.content = data End If Catch ex As Exception Throw ex Finally myFileStream.Close() End Try 2,147,483,647 elements Or Int32.MaxValuemaximum size

所以我的总2 GB(3.08亿< 20亿)和length of my array is well within the limits然后提出2 GB(文件大小为298 mb)。

问题: 所以我的问题,关于数组还有什么可能导致my size is way smaller

注意:对于那些想知道服务器仍有10gb免费ram空间的人

注2:关注dude's advice我在几次运行中监控了GDI对象的数量。该过程本身永远不会超过计数1500个对象。

2 个答案:

答案 0 :(得分:3)

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

例如,在我的机器上,我不能在一个阵列中分配超过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) 
}

答案 1 :(得分:1)

您可以在不首先加载到内存中的情况下读取/写入数据。如果您不想更改原始文件,请System.IO.File.Copy该文件。

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!")

另请参阅:http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k%28System.IO.FileStream.WriteByte%29;k%28TargetFrameworkMoniker-.NETFramework