【发布时间】:2021-10-04 00:23:15
【问题描述】:
我正在尝试确定以下代码是否存在严重错误。它从数据库中读取二进制文件,将其存储为图片并与动物记录的对象相关联。
对于每一行(动物的记录):
byte[] ba = (byte[])x.ItemArray[1]; //reading binary from a DB row
using (MemoryStream m=new MemoryStream(ba))
{
Image i = Image.FromStream(m); //exception thrown occassionally
c.Photo = i;
listOfAnimals.Add(c);
}
首先,加载 18 张图片(JPG 文件总共有 105 Mb),正在运行的应用程序使用 2 GB 内存。没有加载图片,它只有 500 Mb。 通常在标记点引发异常,其来源是系统绘图。
谁能帮我优化代码或告诉我问题出在哪里?我一定是用错了函数……
【问题讨论】:
-
您的内存已用完!唯一的解决方法是添加更多内存或在内存耗尽时将硬盘用作交换空间。
-
@jdweng 但是 105 Mb 的图片怎么会占用和耗尽 2 Gb 的内存呢?我怀疑它没有被正确清除
-
JPEG 被压缩,因此 JPG 文件的大小!= 所需的内存量。图像可能需要每个像素最多 4 个字节。因此,一个 8MP 图像可能只需要 1 - 5 MB 磁盘空间(取决于压缩级别),但可能需要 24 MB 内存。
-
基本提示 - 不要将二进制文件存储在数据库中。您可以将它们存储在文件系统上吗?
-
忘了提一下,不要忘记在不再需要图像时、在加载新图像集之前或关闭
Form时处理掉图像。
标签: c# exception memory drawing