需要裁剪+调整 ~300000 个文件。运行时间 = 4 天以上。我怎样才能加快我的 bash 脚本?
Need to crop+resize ~300000 files. Runtime = 4+ days. How can I speed up my bash script?
我正在制作视频延时摄影。我拍摄的所有照片都是以 4:3 纵横比拍摄的 .jpg 图片。 2592x1944 分辨率。我希望它们都是 16:9 1920x1080。
我已经写了一个小脚本来做这个,但是过程不是很快。我花了大约 17 分钟来裁剪和调整 750 张图像。我总共要处理大约 300,000 个,然后可能会分批处理大约 50,000 个。即每批 18 小时 45 分钟,总共计算时间超过 4.5 天。
那么有人知道我可以加速这个程序的方法吗?
这是我写的 bash 脚本:
#!/bin/bash
mkdir cropped
for f in *.JPG
do
convert $f -resize 1920x1440 -set filename:name '%t' cropped/'%[filename:name].JPG' #Resize Photo, maintain aspect ratio
convert cropped/$f -crop 1920x1080+0+ -set filename:name '%t' cropped/'%[filename:name].JPG' #Crop to 16:9 aspect ratio, takes in argument for where to begin crop
done
echo Cropping Complete!
在循环中的每一行前后放置一些 echo 命令表明调整大小比裁剪花费更多的时间,我想这并不奇怪。我曾尝试使用 mogrify -path cropped -resize 1920x1440! $f
代替 convert $f -resize
,但速度似乎没有太大差异。
那么,有什么方法可以加快运行时间吗?
奖励积分 如果你能告诉我一个简单的方法来简单地指示程序运行的进度(比如“750 个文件中的 421 个,完成 56.13%”) .
额外奖励积分 如果您可以添加命令以从每个帧输出 .mp4 文件,该文件可以在 SONY Vegas 等软件程序中编辑。我已设法使用 mencoder 从这些照片中制作视频文件 (.avi),但生成的视频无法在我尝试过的任何视频编辑器中使用。
首先,为了加快速度,不要将内容回显到屏幕上,而是将其回显到文件中,如果您想知道状态,请读取文件(使用 tail 命令轻松完成),说真的,这已经更快了。但是,这似乎并不是您程序的真正瓶颈。
我可以推荐的主要内容是并行 运行 它,有什么原因不能在图片 #4 之前裁剪+调整图片 #1000 的大小吗?如果没有,则修改脚本以接收一些指定它应该处理哪些文件的参数,然后 运行 使用不同的参数多次,这应该减少大约 CPU 个内核的时间你有(减去一些硬盘 I/O 时间)。
关于你的第一个奖金问题,你可以做这个代码的变体
TOTAL=`ls -1|wc -l` #get the total number of files (you can change this to the files parameter I mentioned above
SOFAR=0 #How many files you've done so far
for f in *.JPG
do
((SOFAR++))
echo "done so far $SOFAR out of $TOTAL"
done
有几件事spring要注意...
首先,不要为每张图片启动 ImageMagick 两次,一次调整大小,一次裁剪,因为这两个操作应该可以一次完成。所以,而不是你的两个 convert
命令,我只做一个
convert image.jpg -resize 1920x1440 -crop 1920x1080+0+ cropped/image.jpg
其次,我没有看到你在用 set
命令做什么,一些带有文件名的东西,但你可以在 shell.
中这样做
第三,我建议您使用 GNU Parallel(我每天经常用它处理超过 65,000 张图像)。它易于安装,并确保您支付的所有那些可爱的 CPU 核心保持忙碌。最简单的使用方法是,不用 运行ning 命令,只需回显它们并将它们通过管道传输到 parallel
#!/bin/bash
mkdir cropped
for f in *.jpg
do
echo convert \"$f\" -resize 1920x1440 -crop 1920x1080+0+ cropped/\"$f\"
done | parallel
echo Cropping Complete!
最后,如果您想要一个进度表,或指示完成了多少和还剩下什么,请使用 --eta
选项(eta=预计到达时间)到 parallel
它会告诉您有多少作业以及剩余多少时间。
当您对 parallel
充满信心时,您可能会 运行 您的整个过程如下:
parallel --eta convert {} -resize 1920x1440 -crop 1920x1080+0+32 cropped/{} ::: *.jpg
我创建了 750 张与您的大小相同的图像,然后 运行 以这种方式创建它们,我的中等规格 iMac 需要 55 秒来调整大小和裁剪批次 - YMMV。请添加评论并说明您的进展情况 - parallel
.
的处理时间有多长
使用
-define jpeg:size=1920x1440
选项和 -resize。如果您有旧版本的 ImageMagick(抱歉,我不知道语法何时更改),请使用
-size 1920x1440
选项和 -resize。
我正在制作视频延时摄影。我拍摄的所有照片都是以 4:3 纵横比拍摄的 .jpg 图片。 2592x1944 分辨率。我希望它们都是 16:9 1920x1080。
我已经写了一个小脚本来做这个,但是过程不是很快。我花了大约 17 分钟来裁剪和调整 750 张图像。我总共要处理大约 300,000 个,然后可能会分批处理大约 50,000 个。即每批 18 小时 45 分钟,总共计算时间超过 4.5 天。
那么有人知道我可以加速这个程序的方法吗?
这是我写的 bash 脚本:
#!/bin/bash
mkdir cropped
for f in *.JPG
do
convert $f -resize 1920x1440 -set filename:name '%t' cropped/'%[filename:name].JPG' #Resize Photo, maintain aspect ratio
convert cropped/$f -crop 1920x1080+0+ -set filename:name '%t' cropped/'%[filename:name].JPG' #Crop to 16:9 aspect ratio, takes in argument for where to begin crop
done
echo Cropping Complete!
在循环中的每一行前后放置一些 echo 命令表明调整大小比裁剪花费更多的时间,我想这并不奇怪。我曾尝试使用 mogrify -path cropped -resize 1920x1440! $f
代替 convert $f -resize
,但速度似乎没有太大差异。
那么,有什么方法可以加快运行时间吗?
奖励积分 如果你能告诉我一个简单的方法来简单地指示程序运行的进度(比如“750 个文件中的 421 个,完成 56.13%”) .
额外奖励积分 如果您可以添加命令以从每个帧输出 .mp4 文件,该文件可以在 SONY Vegas 等软件程序中编辑。我已设法使用 mencoder 从这些照片中制作视频文件 (.avi),但生成的视频无法在我尝试过的任何视频编辑器中使用。
首先,为了加快速度,不要将内容回显到屏幕上,而是将其回显到文件中,如果您想知道状态,请读取文件(使用 tail 命令轻松完成),说真的,这已经更快了。但是,这似乎并不是您程序的真正瓶颈。 我可以推荐的主要内容是并行 运行 它,有什么原因不能在图片 #4 之前裁剪+调整图片 #1000 的大小吗?如果没有,则修改脚本以接收一些指定它应该处理哪些文件的参数,然后 运行 使用不同的参数多次,这应该减少大约 CPU 个内核的时间你有(减去一些硬盘 I/O 时间)。 关于你的第一个奖金问题,你可以做这个代码的变体
TOTAL=`ls -1|wc -l` #get the total number of files (you can change this to the files parameter I mentioned above
SOFAR=0 #How many files you've done so far
for f in *.JPG
do
((SOFAR++))
echo "done so far $SOFAR out of $TOTAL"
done
有几件事spring要注意...
首先,不要为每张图片启动 ImageMagick 两次,一次调整大小,一次裁剪,因为这两个操作应该可以一次完成。所以,而不是你的两个 convert
命令,我只做一个
convert image.jpg -resize 1920x1440 -crop 1920x1080+0+ cropped/image.jpg
其次,我没有看到你在用 set
命令做什么,一些带有文件名的东西,但你可以在 shell.
第三,我建议您使用 GNU Parallel(我每天经常用它处理超过 65,000 张图像)。它易于安装,并确保您支付的所有那些可爱的 CPU 核心保持忙碌。最简单的使用方法是,不用 运行ning 命令,只需回显它们并将它们通过管道传输到 parallel
#!/bin/bash
mkdir cropped
for f in *.jpg
do
echo convert \"$f\" -resize 1920x1440 -crop 1920x1080+0+ cropped/\"$f\"
done | parallel
echo Cropping Complete!
最后,如果您想要一个进度表,或指示完成了多少和还剩下什么,请使用 --eta
选项(eta=预计到达时间)到 parallel
它会告诉您有多少作业以及剩余多少时间。
当您对 parallel
充满信心时,您可能会 运行 您的整个过程如下:
parallel --eta convert {} -resize 1920x1440 -crop 1920x1080+0+32 cropped/{} ::: *.jpg
我创建了 750 张与您的大小相同的图像,然后 运行 以这种方式创建它们,我的中等规格 iMac 需要 55 秒来调整大小和裁剪批次 - YMMV。请添加评论并说明您的进展情况 - parallel
.
使用
-define jpeg:size=1920x1440
选项和 -resize。如果您有旧版本的 ImageMagick(抱歉,我不知道语法何时更改),请使用
-size 1920x1440
选项和 -resize。