0

伙计们在我的项目(java)中使用 imagemagick 库进行图像处理。当多个请求到达服务器时,它的响应非常缓慢。现在,多个convert命令(作为单个进程执行)同时执行,以避免process pooling在 im4java 中考虑延迟。以下替代方案会有帮助吗?:

  • im4java 中的进程池- 有没有办法仅在 im4java 中实现(我应该使用 gm4java 包装器,我猜它支持进程池 - 但是,它几乎没有限制,比如不使用缓冲图像)?
  • 专用服务器- 使用专用服务器仅用于图像处理(我想要的最少)。

我应该采用其他方法吗?提前感谢您的帮助!

4

1 回答 1

0

实际上,我们的团队经历了完全相同的需求,因此我们创建了 gm4java。它完全符合您的要求。至于对 BufferedImage 的支持,我们在最新版本中已经支持使用 BufferedImage 作为输入。仍然不支持使用 BufferedImage 作为输出,但您可以轻松解决它。

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

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

有关 im4java 中当前 BufferedImage 实现的更多信息。当使用它作为输入时,它只是简单地写入一个 tmp 文件,这非常慢。当使用它作为输出时,它利用标准输入/标准输出流操作,这比 tmp 文件快,但仍然不是最佳的。最好的方法是将命名管道与 Java NIO 实现结合使用。但这将需要在 im4java 中进行相当多的更改,例如 API 中断。

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

于 2013-10-06T18:57:36.340 回答