创建数组时我得到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.MaxValue
为maximum 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个对象。
答案 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!")