4

当我使用 ImageResizer.Net(在 32 位系统上)调整图像 9000x9000 正方形时遇到内存不足异常:

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 中是否存在大量内存泄漏,或者我的代码中是否存在错误?

无论哪种方式,是否有解决方法?

4

3 回答 3

5

如果要处理 81 兆像素的图像,则需要 64 位系统。仅解压缩图像将需要 350 到 800兆字节的连续RAM。

在 32 位系统上(即使安装了 16GB 的内存),最初只有 1200MB 左右可供任何 .NET 进程使用。由于碎片(不是内存泄漏!),任何活动都会将 1200MB 分成 50-100MB 的小块。由于您需要 800MB 块的内存(因为您正在处理大量图像),因此很快就会停止工作。

为了让 .NET 对抗内存碎片,您需要给它 (a) 时间和 (b) 大量额外空间。

在 64 位系统上,该进程应该能够为 .NET 运行时访问足够的 RAM,以免在这些工作负载下饿死。

于 2013-09-14T17:26:50.263 回答
0

正如计算机语言学家在评论他们自己的答案时提到的那样, libvips 能够在使用(少得多)内存的同时调整大图像的大小。[实际上我最终使用了命令行版本,因为我没有遇到任何用于库本身的 .NET 包装器。]

就我而言,我试图调整大小的图像是 21,920 × 14,610 像素。ImageResizer 成功调整了图像的 PNG 版本 (15+ MB) 的大小,但OutOfMemoryException为 JPEG 版本 (22+ MB) 抛出了一个。

我在具有 8 GB RAM 的计算机上运行 Windows 7 64 位。

于 2014-09-18T20:42:14.457 回答
0

我认为您正在通过一些大图像调整大小来最大化您的 RAM(虽然不确定)。

尝试使用 DiskCache 插件: http ://imageresizing.net/plugins/diskcache http://imageresizing.net/download

它将绕过任何 RAM 问题将调整大小的图像直接写入磁盘。另外,它也非常快。

我很抱歉回答“试试这个”评论作为答案,但由于 SO 声誉不足,我还不能写评论。

于 2013-09-14T16:39:28.527 回答