im4java中的进程池

im4java中的进程池,java,imagemagick,imagemagick-convert,pooling,im4java,Java,Imagemagick,Imagemagick Convert,Pooling,Im4java,我在我的项目(java)中使用imagemagick库进行图像处理。当多个请求到达服务器时,它的响应非常慢。现在,多个convert命令(作为单个进程执行)同时执行,为了避免延迟,我想到了im4java中的进程池。以下备选方案会有帮助吗 im4java中的进程池-是否有任何方法可以单独在im4java中实现(我应该使用gm4java包装器,我想它支持进程池-但是,它几乎没有限制,比如不使用缓冲映像) 专用服务器-使用专用服务器仅用于图像处理(至少是我想要的)。 我还有什么方法可以选择吗?提

我在我的项目(java)中使用imagemagick库进行图像处理。当多个请求到达服务器时,它的响应非常慢。现在,多个
convert
命令(作为单个进程执行)同时执行,为了避免延迟,我想到了im4java中的
进程池。以下备选方案会有帮助吗

  • im4java中的进程池-是否有任何方法可以单独在im4java中实现(我应该使用gm4java包装器,我想它支持进程池-但是,它几乎没有限制,比如不使用缓冲映像)
  • 专用服务器-使用专用服务器仅用于图像处理(至少是我想要的)。

我还有什么方法可以选择吗?提前谢谢你的帮助

实际上,我们的团队经历了完全相同的需求,因此我们创建了gm4java。它正是你想要的。至于对BuffereImage的支持,我们已经支持在中使用BuffereImage作为输入。仍然不支持使用BuffereImage作为输出,但您可以轻松解决此问题

解决方法是让GM将映像写入RAM磁盘(在许多Linux发行版中,您可以免费获得RAM磁盘,对于Windows,有各种可用的解决方案)。现在需要做的就是让Java代码从RAM磁盘读取转换后的映像。与每次启动一个新流程的巨大开销相比,很少的开销(如果有的话)是无关紧要的

即使直接与用于BuffereImage的RAM磁盘方法相比,BuffereImage的大小通常比JPG映像文件的字节数组大10倍。因此,如果您所需要的只是提供图像,而不是在Java中进行额外的处理,那么RAM磁盘方法确实更快,而且使用更少的内存

更多关于im4java中当前BuffereImage实现的信息。当使用它作为输入时,它只是简单地写入一个tmp文件,速度非常慢。当使用它作为输出时,它使用stdin/stdout流操作,这比tmp文件快,但仍然不是最优的。最好是在JavaNIO实现中使用命名管道。但这需要在im4java中进行相当多的更改,最像是API破坏


最后,我不认为GM4Java是IM4Java的包装器,GM4Java的核心是自己运行的,它给了你向GM发送大量并发命令的能力,并将GM的输出返回给你。命令只是字符串列表,因此如果您知道如何编写GM命令,就不需要im4java来使用gm4java。这实际上就是我们在需要原始性能的应用程序中使用的方式。im4java为您提供了一种构造GM命令和解析GM输出的方便方法(但有一些开销)。gm4java中的GMBatchCommand类充当im4java和gm4java之间的桥梁。它允许您使用im4java提供的便利来构造命令,然后使用gm4java引擎来执行命令。gm4java引擎使用与im4java完全不同的机制来管理和与GM通信。这就是它如此快速的原因。

将代码包装在可调用的文件中,并使用合适的执行器来控制并行。我可以处理多个进程(而不是线程)吗有了这个?您的可调用调用调用单个imagemagic实例?每当用户单击时,就会调用对convert命令的请求,该请求将作为一个单独的进程进行处理,每当对图像进行一些操作时,就会创建一个新的进程,这是一种开销,我希望克服这一点!将要调用的Java代码包装为可调用的转换。然后学习如何使用执行器。@Kenneth Xu,我在筛选gm4java文档时遇到困难。如何使用BuffereImage作为GMBatchCommand的输入?