大图像上的 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% 内存。
我的机器有:
- 英特尔® CoreTMi7 四核处理器 i7-4790 (3.6GHz) 8MB 缓存
- 16GB 金士顿双 DDR3 1600MHz
为什么会失败?正如我 运行 ImageJob 在它失败之前没有增加内存使用量(据我所知)。
我正在使用带有 DiskCache 插件的 ImageResizer 3.4.3。
我还应该注意,我可以在 Photoshop 中打开有问题的文件,将长边缩小到 3000 像素,保存,然后 运行 相同的 ImageJob,然后完成而没有错误。
首先,运行 进程以 64 位模式而非 32 位模式运行。这样可以更好地定位所需的 150mb、62mb 和 12mb 连续内存块。如果您触发回退代码路径,或者如果图像是 CMYK jpeg(常见)或有问题,则可能还需要 200mb。
其次,由于您没有使用 URL API,请确保您已经限制了要处理的并发图像的数量。在 ImageResizer v3 中,一次执行 1 或 2 个。
第三,升级到v4,使用FastScaling插件。 You'll get actual concurrency,大块 RAM 将保留更短的时间,这意味着您的吞吐量可以轻松地在这么大的文件上增加 10 倍。
我继承了一个网站,该网站充斥着超大和未压缩的图像,因此我正在自动执行更正它的任务,除了超过一定大小的文件外,该任务大部分都有效。例如,我有一张 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% 内存。
我的机器有:
- 英特尔® CoreTMi7 四核处理器 i7-4790 (3.6GHz) 8MB 缓存
- 16GB 金士顿双 DDR3 1600MHz
为什么会失败?正如我 运行 ImageJob 在它失败之前没有增加内存使用量(据我所知)。
我正在使用带有 DiskCache 插件的 ImageResizer 3.4.3。
我还应该注意,我可以在 Photoshop 中打开有问题的文件,将长边缩小到 3000 像素,保存,然后 运行 相同的 ImageJob,然后完成而没有错误。
首先,运行 进程以 64 位模式而非 32 位模式运行。这样可以更好地定位所需的 150mb、62mb 和 12mb 连续内存块。如果您触发回退代码路径,或者如果图像是 CMYK jpeg(常见)或有问题,则可能还需要 200mb。
其次,由于您没有使用 URL API,请确保您已经限制了要处理的并发图像的数量。在 ImageResizer v3 中,一次执行 1 或 2 个。
第三,升级到v4,使用FastScaling插件。 You'll get actual concurrency,大块 RAM 将保留更短的时间,这意味着您的吞吐量可以轻松地在这么大的文件上增加 10 倍。