0

みんな私のプロジェクト(Java)で画像処理にimagemagickライブラリを使用しています。複数のリクエストがサーバーにヒットすると、応答が非常に遅くなります。現在、im4java では複数のconvertコマンド (個別のプロセスとして実行) を同時に実行し、遅延を回避することを考えprocess poolingています。次の代替案は役に立ちますか? :

  • 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 ファイルに書き込まれるため、非常に低速です。これを出力として使用する場合、stdin/stdout ストリーム操作を利用します。これは tmp ファイルよりも高速ですが、それでも最適ではありません。最善の方法は、Java NIO 実装で名前付きパイプを使用することです。しかし、それには API の破壊と同様に、im4java にかなりの変更が必要になります。

最後に、gm4java を im4java のラッパーとは見なしません。gm4java のコアは単独で実行され、大量の同時コマンドを GM に送信し、GM の出力を返す機能を提供します。コマンドは単なる文字列のリストなので、GM コマンドの書き方を知っていれば、gm4java を使用するのに im4java は必要ありません。これは、生のパフォーマンスを要求するアプリケーションで実際に使用した方法です。im4java は、GM コマンドを構築し、GM 出力を解析するための便利な方法 (多少のオーバーヘッドを伴います) を提供します。gm4java の GMBatchCommand クラスは、im4java と gm4java の間のブリッジとして機能します。im4java の利便性を利用してコマンドを作成し、gm4java エンジンを使用してコマンドを実行できます。gm4java エンジンは、im4java とはまったく異なるメカニズムを使用して、GM の管理と通信を行います。そしてそれは'

于 2013-10-06T18:57:36.340 に答える