我试图以8,733 x 12,945像素的代码打开PNG图像。根据我的计算,这应该需要431.247 MiB(8733 * 12945 * 4)的内存来存储像素。但是,当我的构建平台是AnyCPU时,任何从C#打开文件的尝试(使用new Bitmap(string filename)
)都会导致OutOfMemoryException。当我将平台切换到x64时,图像会毫无问题地打开。
有没有人知道为什么我会尝试打开一个需要比2 GiB(2 ^ 31)阈值少得多的内存的图像?
- 开始编辑 -
是的,我知道内存碎片的概念。我有一个WebForm,它只需要在客户端从文件选择器对话框中选择文件时调用新的Bitmap。我的期望是该应用程序执行以下操作:
1)为Windows窗体分配足够的内存(为了安全起见,给它20kB) 2)用户选择一个文件,因此app打开一个流(可能是8kB缓冲区)并读取头信息(前几百个字节)。 3)标题指示图像大小和像素格式,因此构造函数然后分配足够大的缓冲区以适合像素(450 MB)。
我知道我的记忆要么非常碎片,要么GDI +试图以奇怪的方式分配空间。我不明白为什么会发生这种情况?在我的应用程序中没有任何资源密集型,因此内存不应该分段到足以防止分配大约20%的可寻址空间。有什么可以阻止这样的分配?位图构造函数是否需要比我计算的更多内存?
答案 0 :(得分:0)
您应该使用流来读取大文件。此异常与可用物理内存量无关。如果您需要更多信息,您应该阅读以下文章: http://blogs.msdn.com/b/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx