如何高效压缩数百万张JPG图片?并行处理加速转换的实现方案
MacOS下JPG图片批量并行压缩提速方案
推荐方案:使用GNU Parallel(最省心,性能最优)
GNU Parallel是专门用来并行执行命令行任务的工具,会自动根据CPU核心数控制并发量,还能处理带特殊字符、空格的文件名,非常适合百万级文件的场景:
- 先安装工具:
brew install parallel - 全量压缩命令(避开参数列表过长问题):
find . -maxdepth 1 -type f -name "*.jpg" -print0 | parallel -0 convert {} -quality 80% {}- 可以加
-j 数字参数手动指定并行任务数,比如-j 12就是同时跑12个压缩任务,默认和CPU核心数一致 - 如果要处理子目录里的JPG,删掉
-maxdepth 1参数即可
- 可以加
原生Bash实现方案(不需要装额外工具)
如果你不想安装第三方工具,可以用Bash自带的后台任务+并发数控制实现,要求Bash版本不低于4.3:
#!/bin/bash # 取当前设备CPU核心数作为最大并行任务数 max_concurrent=$(sysctl -n hw.ncpu) task_count=0 for img in *.jpg; do convert "$img" -quality 80% "$img" & ((task_count++)) # 达到并发上限后等待任意一个任务完成再继续 if (( task_count >= max_concurrent )); then wait -n ((task_count--)) fi done # 等待所有剩余任务执行完毕 wait
注意:百万级文件场景下不要直接用*.jpg匹配,会触发参数列表过长错误,同样换成find输出文件列表的方式读取即可
额外性能优化技巧
想要更快的压缩速度和更好的压缩比,可以替换默认的ImageMagick编码器为mozjpeg:
- 安装mozjpeg:
brew install mozjpeg - 把上面命令里的
convert {} -quality 80% {}替换为djpeg {} | cjpeg -quality 80 -outfile {}即可,同等画质下压缩率更高,速度也比默认convert快20%以上
重要注意事项
- 跑全量压缩前一定要先备份原文件,或者先抽几十张测试压缩效果符合预期再全量执行
- 如果图片存在外接机械硬盘里,不要把并发数开太高,IO带宽会成为瓶颈,反而会拖慢整体速度,建议并发数设为CPU核心数的1/2即可
内容的提问来源于stack exchange,提问作者mmz
相关产品推荐
相关产品推荐

