2

Scala プロセス (JeroMQ) と C プロセス (ZeroMQ) の間の通信を確立する必要があります。Scala プロセスは、大きな配列を送信する必要があります (配列ごとに 1 億の float)。これは最初に JSON 文字列に変換されます。以下に示すように、メモリの問題が発生しています。

java.lang.OutOfMemoryError: Requested array size exceeds VM limit
    at java.lang.StringCoding.encode(StringCoding.java:350)
    at java.lang.String.getBytes(String.java:939)
    at org.zeromq.ZMQ$Socket.send(ZMQ.java:1276)

1 億 float は 762 MB に相当します。シリアル化された JSON 文字列が巨大になっているように見えます。はいの場合、このサイズのデータ​​を転送する最善の方法は何ですか?

4

3 に答える 3

1

まず最初に、json やその他のデータ シリアライゼーション形式に固有のもので、大規模なデータ セットを実行できないものは何もありません。それを処理するために必要なリソースがマシンにあることを確認するだけで済みます。

特定の形式は、他の形式よりもメモリ効率が高い場合があります。ほとんどの場合、バイナリ形式の方が適しています。

ただし、状況によっては (たとえば、データセット全体へのアクセスを常に更新する必要がある場合など)、user3666197 の回答がシナリオにより適している可能性があります。

違いを分割させてください。

ユースケースが次のパラメータに適合する場合:

  1. データセット全体に頻繁にアクセスする必要がない
  2. 長い待ち時間に対処できます
  3. 受信ホストで使用可能なリソースを増やすことはできません
  4. 受信側ホストで継続的に更新されるローカル データ ストアを作成することはできません(または非常に困難です)。

... 最善の策は、データセットを単純に分割することです。リソースを使い果たすことなく送信および解析できるメッセージの大きさを確認し、20 ~ 50% のバッファ (許容度に応じて) を確保し、データ セットアップをそのサイズのチャンクに分割し、チャンクを送信して再構築します。 . これは、メモリの問題は、シリアル化解除プロセス中にメモリ内のシリアル化されたデータとシリアル化されていないデータの両方を同時に処理したことが原因であるという仮定の下で機能しています。そうではなく、シリアル化されていないデータセット自体が大きすぎてメモリに収まらない場合は、データを再構築せずにチャンクで処理する必要があります。だったら強くあなたはエッジに住んでいるので、メモリリソースを増やす方法を見つけることをお勧めします.

于 2016-04-04T17:08:58.207 に答える