2016-09-01 2 views
0

私は、単一の不変のデータ構造で多数の数値を扱うアプリケーションで作業しています。 (非常に大きな配列のコレクション、本質的​​には大きな行列です。典型的なサイズは、200列×100,000行の2倍となります)。多くの計算をさまざまな方法で並列化できます。私は、Akka問題に取り組むアクターモデル。Akkaの俳優間で大きな不変のデータを共有またはアクセスする

私はこの行列(またはその一部)をメッセージに渡す必要があることを心配しています。なぜなら、それにはたくさんのコピーとシリアライゼーションが必要だと思うからです。

私はこの問題を熟考していますか? (つまり、スーパーバイザーアクターがこの行列の配列の一部を従属オブジェクトに渡した場合、Akka実行時は参照として渡すだけのスマートなので、すべてを同じJVM上に保持していると仮定します渡すメッセージ?)

私は、質問をする簡単な方法は、大規模なデータ構造がメッセージに渡される状況を避けるべきですか?

繰り返してください:問題のこのデータは完全に完全に変更できません。それは決して変化しません。

答えて

2

remote actor(または拡張子はクラスタノード)に送信すると、Akkaはメッセージをシリアル化します。リモートは必ずしも適切なネットワークが関与していることを意味するものではありません。同じマシン上の異なるJVM(ループバックインターフェイス上)だけでもかまいません。 1つのJVM上に1つのアクターシステムがあり、リモート操作が行われていない場合は、メッセージをキューに入れて別のスレッドで読み取るのと同じ方法で参照のみが渡されます。

1

通常、非常に大きなデータ構造をリモートアクターに渡すべきではありません。その代わりに、あなたのデータ構造をある種の永続ブロブストア(HDFS、S3など)にアップロードして、新しいデータが処理可能であることをリモートアクタに伝えるメッセージを送信します。

+0

ありがとうございました。私は極端な場合にはそうであると考えました。しかし、相対的な問題は、「非常に大きな」という意味です。私のアプリケーションでは、サイズがそれぞれ10〜1000万の倍数(または時には整数)の配列を約10個集めて考えました。小さい方では数メガバイトのように見えるので、それは大丈夫だと思っていますが、上限のしきい値は何か分かりません。重要なのは、スピードは重要なアーキテクチャ上の要素であるということです。 –

関連する問題