gpt4 book ai didi

.net - 创建数组时出现 SystemOutOfMemoryException

转载 作者:行者123 更新时间:2023-12-04 20:06:29 24 4
gpt4 key购买 nike

我收到了 SystemOutOfMemoryException创建数组时。然而length我的阵列 does not超过 Int32.MaxValue .

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

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

根据这个问题“ SO Max Size of .Net Arrays”和这个问题“ Maximum lenght of an array”的最大长度是 2,147,483,647 elements Or Int32.MaxValuemaximum size2 GB
所以我的总数 length of my array is well within the limits (3.08 亿 < 20 亿)以及 my size is way smaller然后显示 2 GB(文件大小为 298 mb)。

问题:
所以我的问题,关于数组还有什么可能导致 MemoryOutOfMemoryException ?

注:对于那些想知道服务器仍然有一些 10gb 可用内存空间的人

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

最佳答案

字节数组是序列中的字节。这意味着您必须分配如此多的内存,因为您的数组长度在一个块中。如果您的内存碎片比系统大,即使您有 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)
}

关于.net - 创建数组时出现 SystemOutOfMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25181156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com