0

py4j を使用して、Scala から Python にバイト配列 (Array[Byte]) を送信しています。Python側では、これらのバイトの単なるビューであるがnp.complex128として解釈されるnumpy配列(できれば不変)を作成したいと考えています。バイト順を無視すると、バイトは次のように並べられますreal1, imag1, real2, imag2, ...

Python 3.5 および py4j 0.10.3 のpy4j ドキュメントによると、Python 側でバイト オブジェクトを取得する必要があるようですが、実際には JavaArray を取得しています。 jvm側がこれをかなり遅くしていると思います。これは、バイトからバイト (クラス) への Scala の「オートボクシング」によるものだと推測していますが、よくわかりません。

Py4j の質問: py4j にバイトのコピーを強制的に返すことは可能ですか?

Scala の質問: おそらく私の推測は間違っていて、この場合、実際にはプリミティブなバイト配列にコンパイルされますか? そうでない場合は、代わりにJavaでその部分を書く以外に、とにかくそれが確実に行われるようにすることは可能ですか?

4

1 に答える 1

1

Python で Py4J に bytearray を強制的に取得させる唯一の方法は、Java が byte[] を送信していることを確認することです。

私は現在、これらのタイプの転送を高速化し、これらのシナリオ用のアダプターを簡単に作成できる新しいバイナリー・プロトコル (0.11) に取り組んでいます。ボックス化されたプリミティブ配列をネイティブにサポートする予定はありませんが、Scala および Py4J で動作するユーティリティのコレクションであるspylonを確認することをお勧めします。

別の可能性: Spark チームは Py4J を使用して Scala と対話しますが、現在 Py4J では高速な操作ではないため、セカンダリ ソケットを使用して大きなバイト配列を転送しています。

于 2016-10-06T13:06:19.670 に答える