大图像上的 ImageResizer 内存不足异常

ImageResizer Out of Memory Exception on large image

我继承了一个网站,该网站充斥着超大和未压缩的图像,因此我正在自动执行更正它的任务,除了超过一定大小的文件外,该任务大部分都有效。例如,我有一张 8176x6132 300dpi 和 24 位深度的 JPG 图片,文件大小为 4.49mb。

这是我的 ImageJob

var instructions = new Instructions("width=1920;height=0;mode=max");
var resizedImg = new ImageJob(filePath, filePath, instructions).Build();

我的机器上有大量可用资源,但出现内存不足异常。当我现在测试这个时,我有 90% CPU 空闲和 51% 内存。

我的机器有:

为什么会失败?正如我 运行 ImageJob 在它失败之前没有增加内存使用量(据我所知)。

我正在使用带有 DiskCache 插件的 ImageResizer 3.4.3。

我还应该注意,我可以在 Photoshop 中打开有问题的文件,将长边缩小到 3000 像素,保存,然后 运行 相同的 ImageJob,然后完成而没有错误。

Diagnostics page output and exception stack trace

首先,运行 进程以 64 位模式而非 32 位模式运行。这样可以更好地定位所需的 150mb、62mb 和 12mb 连续内存块。如果您触发回退代码路径,或者如果图像是 CMYK jpeg(常见)或有问题,则可能还需要 200mb。

其次,由于您没有使用 URL API,请确保您已经限制了要处理的并发图像的数量。在 ImageResizer v3 中,一次执行 1 或 2 个。

第三,升级到v4,使用FastScaling插件。 You'll get actual concurrency,大块 RAM 将保留更短的时间,这意味着您的吞吐量可以轻松地在这么大的文件上增加 10 倍。