使用R并行批量调整图像尺寸

4

我正在尝试使用R批量调整(即减小文件大小)数千张图片的大小。我已经使用下面的代码实现了这一点,但是当调整大小>50,000张图片时,它需要很长时间。是否有任何方法可以在多个核心上运行此任务?我对并行计算完全是个新手,因此非常感谢任何帮助。提前感谢!

library(imager)    

pages <- list.files(path = '...insert directory path...',
                full.names = TRUE)


for(x in 1:length(pages)) {

file <- load.image(pages[x])

resized <- imresize(file,
                  scale = 0.390625)

save.image(resized,
         file = gsub("JPG", "jpg", paste(pages[x])))

}

看了一下例如foreach包:ftp://cran.r-project.org/pub/R/web/packages/foreach/vignettes/foreach.pdf - Rentrop
你可以使用snow和snowfall包进行并行处理。 - Blacksad
感谢大家的建议。我使用的是运行OS X El Capitan的Mac电脑。我已经尝试使用ImageMagick来完成这个任务(使用mogrify),但我发现它甚至更慢。不过,我还没有尝试@tobiasegli_te提出的建议。如果能在R中完成所有操作就太好了。 - Ross
如果更快的话,您可以使用 system() 运行命令行函数,以便将分析保留在 R 中。 - tobiasegli_te
1
谢谢@tobiasegli_te。我成功让它工作了,而且比我的原始代码快很多,但是Mark使用GNU parallel的建议甚至更快。再次感谢你的帮助! - Ross
显示剩余2条评论
1个回答

3
秘密武器是 GNU Parallel 。使用 homebrew 安装它:
brew install parallel

现在,创建一个输出目录以防止你的输入图像被覆盖,并并行运行一堆mogrify命令:

mkdir results
parallel -X mogrify -resize 39% -path results ::: *.jpg

在你熟悉这个过程之前,请务必备份!!!

基准测试

我制作了1,000张大小为400x400的随机噪声JPEG图像,并按顺序进行转换:

time for i in *.jpg; do convert $i -resize 39% results/$i; done

real    0m19.086s
user    0m18.615s
sys     0m3.445s

然后并行执行:

time parallel -X mogrify -resize 39% -path results ::: *.jpg

real    0m3.351s
user    0m23.021s
sys     0m0.706s

太好了 - 我很高兴它对你有用!在运行时打开“活动监视器”,并按下CMD-2CMD-3,以记住为什么你要为那个Intel Core i7多花钱 :-) - Mark Setchell
好的!我有另一个潜在的挑战,它旨在批量模糊图像并行处理(http://stackoverflow.com/questions/40044958/batch-blur-images-using-multiple-cores)。如有可能,请提供任何帮助。再次感谢! - Ross
嗨@Mark Setchell,我得到了与其他示例相同的错误信息(-bash:/usr/local/bin/parallel:参数列表太长)。我尝试以与其他示例相同的方式修改代码,但没有起作用。 - Ross
如果可以的话,最好进行“原地”修改 - 即通过修改原始文件来进行修改,因此请在副本上执行以下操作。cd /path/to/images; find . -name \*.jpg -print0 | parallel -0 -X mogrify -resize 39% {} - Mark Setchell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接