当我使用ImageResizer.Net(在32位系统上)调整图像9000x9000 square时,我遇到内存不足异常:
ImageBuilder.Current.Build(imageFileName, outputFileName, settings, true);
我能够使用流成功调整大图像的大小:
using (var stream = new FileStream(imageFileName, FileMode.Open, FileAccess.Read))
using (var img = Image.FromStream(stream, true, false))
{
ImageBuilder.Current.Build(img, outputFileName, settings);
stream.Close();
}
但是,最后一个方法在x循环后仍会遇到内存不足异常。 ImageResizer中是否存在大量内存泄漏,或者我的代码中是否有错误?
无论哪种方式,是否有解决方法?
答案 0 :(得分:3)
如果您要处理81百万像素图像,则需要64位系统。只需解压缩图像就需要350到800个连续兆字节的RAM。
在32位系统上(即使安装了16GB的ram),任何.NET进程最初只能使用1200MB左右。由于碎片(不是内存泄漏!),任何活动都会将1200MB分成小的50-100MB块。由于你需要800MB块的内存(因为你正在处理海量图像),所以它会停止工作。
要允许.NET打击内存碎片,你需要给它(a)时间和(b)足够的额外空间。
在64位系统上,该进程应该能够访问足够的RAM,以便.NET运行时不会在这些工作负载下挨饿。
答案 1 :(得分:0)
我认为你的内存最大化了一些大图像(但不确定)。
尝试使用DiskCache插件: http://imageresizing.net/plugins/diskcache http://imageresizing.net/download
它会将已调整大小的图像直接写入磁盘,绕过任何RAM问题。而且它也非常快。
我很抱歉回答“试试这个”评论作为答案,但由于SO声誉不足,我暂时无法撰写评论。
答案 2 :(得分:0)
正如计算机语言学家在对their own answer的评论中所提到的,libvips能够在使用(更少)内存时调整大图像的大小。 [我实际上最终使用了命令行版本,因为我没有遇到任何用于库本身的.NET包装器。]
在我的情况下,我试图调整大小的图像是21,920×14,610像素。 ImageResizer成功调整了图像的PNG版本(15+ MB),但为JPEG版本(22 + MB)投了OutOfMemoryException
。
我在拥有8 GB RAM的计算机上运行Windows 7 64位。