在我的项目(Java)中,人们正在使用imagemagick库进行图像处理。当多个请求到达服务器时,响应非常慢。现在,多个convert命令(作为一个单独的进程执行)同时执行,以避免process pooling在im4java中的延迟。下列备选方案有任何帮助:
我是否应该使用其他方法?谢谢你提前提供帮助!
发布于 2013-10-06 18:57:36
实际上,我们的团队经历了完全相同的需求,因此我们创建了gm4java。它做的正是你想要的。至于对BufferedImage的支持,我们已经支持在最新发布中使用BufferedImage作为输入。使用BufferedImage作为输出仍然不受支持,但您可以轻松地解决它。
解决办法是让GM将映像写入RAM磁盘(在许多Linux发行版中,您可以免费获得RAM磁盘,Windows有各种可用的解决方案)。现在需要做的就是让Java代码从RAM磁盘读取转换后的映像。与每次启动新进程的巨大开销相比,很少的开销(如果有的话)是冷漠的。
即使直接与BufferedImage的RAM磁盘方法相比,BufferedImage的大小通常也比JPG映像文件的字节数组大10倍。因此,如果您所需要的只是提供图像而不是在Java中进行额外的处理,那么RAM磁盘方法确实更快,而且使用的内存也更少。
有关当前BufferedImage在im4java中实现的更多信息。当使用它作为输入时,它只是被写入一个tmp文件,这是非常慢的。当使用它作为输出时,它使用stdin/stdout流操作,这比tmp文件更快,但仍然不是最优的。最好是在Java实现中使用命名管道。但这将需要对im4java进行相当多的修改,最像破坏API。
最后,我不认为gm4java是im4java的包装器,它是gm4java的核心,它使您能够向GM发送大量并发命令,并将GM的输出返回给您。命令只是一个字符串列表,所以如果您知道如何编写GM命令,则不需要im4java来使用gm4java。这实际上是我们在要求原始性能的应用程序中使用的方式。im4java为您提供了一种构造GM命令和解析GM输出的方便方法(具有一定的开销)。GMBatchCommand类在gm4java中充当im4java和gm4java之间的桥梁。它允许您使用im4java提供的方便来构造命令,然后使用gm4java引擎执行命令。gm4java引擎使用与im4java完全不同的机制来管理和与GM通信。这就是它如此之快的原因。
https://stackoverflow.com/questions/18842831
复制相似问题