如何从 EC2 实例合成存储在 ImageMagick 中 S3 上的大图像?

How to composite large images stored on S3 in ImageMagick from EC2 instances?

我有一个正在进行的图像处理任务列表,使用 ImageMagick 合成大型单个图形文件(每个 20MB)。这些图像目前存储在 S3 上(总共约 2.5GB)。

我正在考虑使用多个 EC2 实例来处理任务、合成图像并将输出文件上传到 S3。

此设置的问题是 ImageMagick 需要本地文件库(在机器上)。目前图像在 S3 上,这意味着每个实例都需要从 S3 下载图像的副本,从而减慢整个过程。

将此图片库共享到所有节点的最佳方式是什么?

还要考虑以下几点:

  1. 您可以通过"saving"任何特殊格式的输入图像MPR:Magick 像素寄存器).有关详细信息,请参阅此答案:"ImageMagick multiple operations in single invocation"

  2. ImageMagick 可以通过 http://.

  3. 访问远程图像
  4. 您可以将 lot 的 ImageMagick 操作放入一个命令行中,该命令行也可以生成多个输出文件,并且您可以将该命令行分段为子- 或使用括号语法进行副处理:... \( IM side process \) ... for the sub-/side-processes.

如何简化整个流程在很大程度上取决于您到底想做什么。然而,

  • MPR: / MPC: 技术对此非常有用,可能会避免或最大限度地减少使用多个 EC2 实例的需要;
  • 您无法绕过以某种方式将输入像素发送到应该处理它们的 ImageMagick 实例的步骤(因此 "downloading a copy" 将始终发生);
  • 您可以通过将输入存储在内存中的一系列 MPR:xy1MPR:xy2 等标签下,然后多次访问所有这些标签来最大限度地减少下载次数 fast 来自长而结构良好的 ImageMagick 命令行,它可以执行您想要的任意数量的合成。

例子

举个例子。考虑有 10 个 TIFF,并且您想从这些 tiff 创建 3 个不同的 PDF 文件,每个 PDF 包含一组由 10 个 TIFF 组成的不同页面。通常你会 运行 3 个命令:

convert 1.tif 3.tif 4.tif 8.tif 9.tif 10.tif -compress jpeg -quality 70 1out1.pdf
convert 2.tif 3.tif 4.tif 7.tif 8.tif  9.tif -compress jpeg -quality 70 1out2.pdf
convert 3.tif 4.tif 5.tif 7.tif 8.tif 10.tif -compress jpeg -quality 70 1out3.pdf

这 3 个命令必须分别加载 6 个 TIFF 文件(一些 TIFF,如 3.tif 在所有 3 个命令中使用)。那是 18 I/O 个事件。

现在考虑这个替代命令,运行 更快(我相信):

convert                         \
  1.tif +write mpr:t1  +delete  \
  2.tif +write mpr:t2  +delete  \
  3.tif +write mpr:t3  +delete  \
  4.tif +write mpr:t4  +delete  \
  5.tif +write mpr:t5  +delete  \
  6.tif +write mpr:t6  +delete  \
  7.tif +write mpr:t7  +delete  \
  8.tif +write mpr:t8  +delete  \
  9.tif +write mpr:t9  +delete  \
 10.tif +write mpr:t10 +delete  \
  \( mpr:t1 mpr:t3 mpr:t4 mpr:t8 mpr:t9 mpr:t10                \
                -compress jpeg -quality 70 +write 2out1.pdf \) \
  \( mpr:t2 mpr:t3 mpr:t4 mpr:t7 mpr:t8 mpr:t9                 \
                -compress jpeg -quality 70 +write 2out2.pdf \) \
  \( mpr:t3 mpr:t4 mpr:t5 mpr:t7 mpr:t8 mpr:t10                \
                -compress jpeg -quality 70 +write 2out3.pdf \) \
  null:

此命令仅加载 10 个 TIFF 中的每一个(总共 10 个 I/O 个事件)。然后它将每个 TIFF 写入带有适当标签的 MPR: 文件,然后从图像序列中删除初始 TIFF。

在此初始准备之后,ImageMagick 将 运行 3 个不同的 parenthese-d 侧处理管道按顺序加载所需的输出页面作为 MPR: 图像,并从每个文件创建一个 PDF。

以上示例可能过于有限,无法通过使用 MPR: 来展示可衡量的优势。因为这个命令也可以达到同样的效果:

convert  \
  1.tif  \
  2.tif  \
  3.tif  \
  4.tif  \
  5.tif  \
  6.tif  \
  7.tif  \
  8.tif  \
  9.tif  \
 10.tif  \
  \( -clone 0,2-3,7-9   -compress jpeg -quality 70 +write 3out1.pdf \) \
  \( -clone   1-3,6-8   -compress jpeg -quality 70 +write 3out2.pdf \) \
  \( -clone   2-4,6-7,9 -compress jpeg -quality 70 +write 3out3.pdf \) \
  null:

但是,还有一个钩子可能会获得一些性能优势:-compress jpeg -quality 70 被应用 3 次到 6 个(克隆的,原始的)图像。

如果我们将此操作应用于 TIFF 写入 MPR 寄存器之前,可能会节省一些 CPU 周期。这样我们只将该操作应用于 10 个 TIFF。以后写PDF的时候就不用再用了:

convert                         \
  -respect-parentheses          \
  1.tif  -compress jpeg -quality 70 +write mpr:t1  +delete  \
  2.tif  -compress jpeg -quality 70 +write mpr:t2  +delete  \
  3.tif  -compress jpeg -quality 70 +write mpr:t3  +delete  \
  4.tif  -compress jpeg -quality 70 +write mpr:t4  +delete  \
  5.tif  -compress jpeg -quality 70 +write mpr:t5  +delete  \
  6.tif  -compress jpeg -quality 70 +write mpr:t6  +delete  \
  7.tif  -compress jpeg -quality 70 +write mpr:t7  +delete  \
  8.tif  -compress jpeg -quality 70 +write mpr:t8  +delete  \
  9.tif  -compress jpeg -quality 70 +write mpr:t9  +delete  \
 10.tif  -compress jpeg -quality 70 +write mpr:t10 +delete  \
  \( mpr:t1 mpr:t3 mpr:t4 mpr:t8 mpr:t9 mpr:t10  4out1.pdf \) \
  \( mpr:t2 mpr:t3 mpr:t4 mpr:t7 mpr:t8 mpr:t9   4out2.pdf \) \
  \( mpr:t3 mpr:t4 mpr:t5 mpr:t7 mpr:t8 mpr:t10  4out3.pdf \) \
  null:

更新

Mark Setchell 的评论很准确。在他提到它之前我忽略了这一点。 运行 这样的命令可能更快(而且输入肯定少得多):

convert                          \
  -respect-parentheses           \
  -compress jpeg -quality 70     \
  1.tif  +write mpr:t1  +delete  \
  2.tif  +write mpr:t2  +delete  \
  3.tif  +write mpr:t3  +delete  \
  4.tif  +write mpr:t4  +delete  \
  5.tif  +write mpr:t5  +delete  \
  6.tif  +write mpr:t6  +delete  \
  7.tif  +write mpr:t7  +delete  \
  8.tif  +write mpr:t8  +delete  \
  9.tif  +write mpr:t9  +delete  \
 10.tif  +write mpr:t10 +delete  \
  \( mpr:t1 mpr:t3 mpr:t4 mpr:t8 mpr:t9 mpr:t10  5out1.pdf \) \
  \( mpr:t2 mpr:t3 mpr:t4 mpr:t7 mpr:t8 mpr:t9   5out2.pdf \) \
  \( mpr:t3 mpr:t4 mpr:t5 mpr:t7 mpr:t8 mpr:t10  5out3.pdf \) \
  null:

你必须 运行 在你自己的环境中使用你自己的图像进行你自己的基准测试,但是,如果你想决定你应该喜欢哪个建议的命令。