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

Amazon ec2 如何从EC2实例合成ImageMagick中存储在S3上的大型图像?,amazon-ec2,parallel-processing,imagemagick,celery,Amazon Ec2,Parallel Processing,Imagemagick,Celery,我有一个正在进行的图像处理任务列表,使用ImageMagick合成单个大型图形文件(每个20MB)。这些图像当前存储在S3上(总共约2.5GB) 我正在考虑使用多个EC2实例来处理任务、合成图像并将输出文件上载到S3 此设置的问题是ImageMagick需要文件库是本地的(在计算机上)。目前,映像位于S3上,这意味着每个实例都需要从S3下载映像的副本,从而降低了整个过程的速度 向所有节点共享此图像库的最佳方式是什么?还应考虑以下几点: 通过以特殊格式MPR:(Magick像素寄存器)“保存”任何

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

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

此设置的问题是ImageMagick需要文件库是本地的(在计算机上)。目前,映像位于S3上,这意味着每个实例都需要从S3下载映像的副本,从而降低了整个过程的速度


向所有节点共享此图像库的最佳方式是什么?

还应考虑以下几点:

  • 通过以特殊格式
    MPR:
    (Magick像素寄存器)“保存”任何输入图像,您可以完全在内存中对ImageMagick文件进行任何处理。有关详细信息,请参见以下答案:

  • ImageMagick可以通过http://访问远程图像

  • 您可以将ImageMagick的许多操作放在一个命令行中,该命令行也可以生成多个输出文件,您可以使用括号语法将该命令行分段为子进程或副进程:
    \(IM端进程\)…
    用于子/端进程

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

    • MPR:
      /
      MPC:
      技术对此非常有用,并且可能避免或最小化使用多个EC2实例的需要
    • 您无法绕过该步骤,以某种方式将输入像素发送到应处理它们的ImageMagick实例(因此“下载副本”将始终发生)
    • 您可以将输入存储在内存中的一系列
      MPR:xy1
      MPR:xy2
      等标签下,然后从一个长且结构良好的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事件

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

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

    初始准备完成后,ImageMagick将按顺序运行3个不同的圆括号d端处理管道,将所需的输出页面加载为
    MPR:
    images,并从每个页面创建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
    应用于每个图像的6个(克隆的、原始的)图像3次

    如果我们在TIFF写入MPR寄存器之前将此操作应用于TIFF,则可能需要节省一些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:
    
    更新 马克·塞切尔的评论恰到好处。在他提到这件事之前,我忽略了这一点。按如下方式运行命令可能更快(当然也更少键入):

    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:
    

    不过,如果您想决定使用哪种建议的命令,您必须在自己的环境中使用自己的图像运行自己的基准测试。

    您需要只执行一次还是经常执行?一个ImageMagick命令看起来像什么?您使用什么来管理队列?是否所有EC2节点都需要所有映像,或者任务是可拆分的,因此您可能只需要每个节点上映像的一个子集?适当的总工作量是多少?例如,通过合成20幅3000x2000像素的输入图像,每幅图像生成80幅输出图像。使用附加信息和示例命令更新问题当你说“文件库”时,你是指图像文件库还是指用于文件操作的软件库?你到底在问什么?这里似乎有3个问题:1)是否有比ImageMagick更快的方法来执行此文件操作2)是否应该使用芹菜/RabbitMQ或SQS 3)是否有更好的方法来共享此文件库。就目前而言,你的问题太宽泛了——你似乎在寻找一个完整的设计——这个网站是用来回答特定的、单一主题的问题的——你可能应该问3个独立的问题,这可能会让你得到你需要的信息。另外,你实际上想尽量减少什么?传输的S3数据量?EC2的总运行时间是多少?用户体验的从开始到结束的时间?很好的答案-让我投票!不过有一个想法,在你的上一个例子中,我认为
    -compress
    -quality
    是设置,所以一开始只设置一次就足够了,而不是重复它们,不是吗?@MarkSetchell:谢谢你的提示。我把它包括在我的更新中。
    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: