【发布时间】:2014-05-24 14:33:58
【问题描述】:
这个问题是关于使用 gm4java 库与 Graphics Magick(在 Scala 中)进行交互的。
我一直在测试 PooledGMService,因为它在 scala 中演示了 here,并且运行良好。
但是,我注意到它在 gm (gm batch batchfile.gm) 的命令行界面中的执行方式与批处理模式不同。当我从命令行运行带有任意数量图像的 gm 批处理文件时,它会启动 1 gm 进程。但是,如果我:
val config = new GMConnectionPoolConfig()
val service = new PooledGMService(config)
然后跨 4 个线程共享服务实例,我在每个线程上对一个图像执行一些操作,例如:
service.execute(
"convert",
srcPath.toString(),
"-resize", percent + "%",
outPath.toString()
)
我看到创建了 4 个单独的 gm 进程。
我认为这会对性能产生影响(使用 100 张图像进行测试,使用上面提到的代码与带有批处理文件的 gm cli 进行测试,需要相同的时间,但我的 scala 代码使用的 CPU 是原来的 4 倍)。
我的问题是:我如何使用 gm4java 以便单个 gm 进程处理多个图像(或至少对同一图像进行多种转换),就像 cli 批处理模式一样?我用no luck here 尝试了一些尝试(有些非常愚蠢)。
我的确切 scala 代码,可以是 found here if you are curious。
2014 年 5 月 27 日更新
在comment by gm4java's author 的指导下,我意识到我正在对两个不同的 gm 命令进行基准测试。更新后的基准测试结果是:
100 x 30MB images (3.09GB tot)
on i7 quadcore (8 logical cpu's w/ hyper-threading)
Criteria Time
gm cli batchfile 106s
my code 1 thread 112s
my code 4 threads 40s
my code 6 threads 31s
my code 7 threads 31s
my code 8 threads 28s
经过仔细检查,我还发现,当我的代码运行时,具有相同进程 ID 的相同 gm 进程始终保持运行。这减轻了我对由于启动和终止 gm 线程相关的一些开销而导致性能下降的担忧。
改写
我想我的问题的核心是如何使 gm4java 尽可能快? tip about matching gm the threadcount with the machine's execution engine count 很有用。还有什么想到的吗?
我的特定用例是将输入图像的大小(平均 30MB,偶尔 50-60MB,很少 100-500MB)调整为几个设置大小(缩略图是最重要和最高优先级)。部署可能会在 amazon ec2 上使用 7 或 14 个“计算单元”
【问题讨论】:
标签: java scala graphicsmagick