7

Django アプリケーション (python) から Java コードを実行するオプションを検索した結果、Py4J が最適なオプションであることがわかりました。Jython、JPype、および Python サブプロセスを試しましたが、それぞれに特定の制限があります。

  • ジソン。私のアプリはpythonで実行されます。
  • JPype はバグがあります。JVM は 1 回だけ起動できますが、その後は再起動できません。
  • Python サブプロセス。通常のコンソール呼び出しのため、Python と Java の間で Java オブジェクトを渡すことができません。

Py4J Web サイトには次のように書かれています。

パフォーマンスの点では、Py4J はソケットに依存しているため、以前のソリューション (Jython と JPype) の両方よりもオーバーヘッドが大きくなりますが、アプリケーションにとってパフォーマンスが重要な場合、Python プログラムから Java オブジェクトにアクセスすることは最善の方法ではない可能性があります。

機械学習フレームワーク Mahout を使用しているため、アプリケーションのパフォーマンスは非常に重要です。私の質問は、Py4Jゲートウェイサーバーが原因でMahoutの実行も遅くなるか、またはこのオーバーヘッドは、Python関数からのJavaメソッドの呼び出しが遅くなることを意味します(後者の場合、Mahoutのパフォーマンスは問題にならず、Py4Jを使用できます)。

4

4 に答える 4

1

PySpark は Py4J をうまく利用しています。すべての重労働が Spark (またはあなたの場合は Mahout) 自体で行われ、結果を「ドライバー」/Python コードに戻したいだけの場合、Py4J もうまく機能する可能性があります。

Py4j では、大量の結果に対するオーバーヘッドがわずかに大きくなります (データフレームの集計/集計のみを返すため、Spark ワークロードの場合は必ずしもそうとは限りません)。py4j がバイナリ シリアライゼーションに切り替えて、より高い badnwidth 要件のオーバーヘッドを削除するための改善に関する議論もあります: https://github.com/bartdag/py4j/issues/159

于 2016-04-24T16:45:47.440 に答える