1

キャッシュとして gemfire を使用しています。キャッシュ ヒープ サイズは 100GB をはるかに超えています。クライアントから gemfire キャッシュにデータを入れると、データがシリアル化されてサーバーに送信され、サーバーではデータがシリアル化された形式で保存されることがわかりました。問題:

  1. サーバー上の関数呼び出しを実行しようとすると、データの逆シリアル化が開始され、実際には時間がかかります。キャッシュ内のオブジェクトを反復処理するだけで 1 時間以上かかる場合もあります。(オブジェクトの数は 600 万に近い)。
  2. gemfire カスタム シリアライゼーション (DataSerializer クラス) を使用してみました。また、すべてのデータがキャッシュに格納された後に必要なメモリの量は約 60 GB で、これは Java のデフォルトのシリアル化を使用した場合と同じです。
  3. Kryo https://github.com/EsotericSoftware/kryoというライブラリを使用してみましたが、これは非常に役立ちますが、クラスの各属性を個別にシリアル化しているため、gemfire のシリアル化が役に立たない理由はまだわかりません。そのため、クラス ヘッダーやその他のメタ データを記述する負担はありません。

どんな助けでも本当に感謝しています。

4

2 に答える 2

0

ヴィベク、

オブジェクトのサイズが大きすぎる場合は、Gemfire https://pubs.vmware.com/vfabric5/index.jsp?topic=/com.vmware.vfabric.gemfire.6.6/getting_startedの Delta Propagation 機能を使用すると役立ちます。 /quickstart_examples/delta_propagation.html

これにはまだシリアライゼーション/デシリアライゼーションのコストがかかりますが、クライアント側との違いは、「オブジェクトで変更されたもの」をプット時にサーバーに送信するだけであり、理論的には、これが他のサーバーとクライアントに複製されることです。クライアントに関心リストを登録してもらいます。

また、クライアント キャッシュ上の通常の PUT は、関数の実行 (onRegion や onServers など) を使用するよりもはるかにパフォーマンスが高いこともわかりました。

于 2015-11-17T06:23:00.690 に答える