2

大きなオブジェクト インスタンスを永続的に JVM メモリに格納して共有し、他のプログラムで複数回実行するために再利用する「簡単な」方法があるかどうかを調べようとしています。Java 8 を使用して netbeans に取り組んでいます。データは、約 500 MB のシリアル化されたオブジェクトです。それらは RAM に簡単に収まりますが、毎回ディスクからデシリアライズするのに数分かかります。

現在、プログラムは実行ごとにシリアル化されたオブジェクトをローカル ディスクからメモリにロードします。データはテスト中にのみ読み取られるため、データをメモリに保持し、実行のたびに直接アクセスするのが最適です。

RMI について調査しましたが、オーバーヘッド、マーシャリング プロセス、および転送によってパフォーマンスが低下します。メモリを共有するなど、同じ JVM で実行されているプログラムからデータに直接アクセスする方法があるかどうか疑問に思っていました。

複数の実行は、同じ入力データで異なる処理/パラメーターをテストすることです。

この「事前読み込み」を実現するためのベスト プラクティスに関する提案をお待ちしております。ヒントをいただければ幸いです。

ありがとう

4

2 に答える 2

1

Java シリアライゼーションは永続化メカニズムとしてうまく機能しません。クラスへの変更は、以前に保存されたオブジェクトと簡単に互換性がなくなり、デシリアライズできなくなります (一般に、すべてのオブジェクト モデルは何らかの形で進化します)。

提案は SO のトピックとはまったく関係ありませんが、HazelcastCoherenceなどの分散キャッシュの使用を検討することをお勧めします。

オブジェクトをロードする必要はありますが、HazelcastCoherenceはどちらも、他の JVM からアクセスできるオブジェクトを格納するスケーラブルな方法を提供し、長期的な永続性と進化するクラスを処理するさまざまな方法を提供します。

ただし、ビッグ オブジェクト グラフではどちらもうまく機能しないため、モデルをキーと値のペアに分割することを検討する必要があります。

例は、キーが次のような複合である注文システムです。

public class OrderItemKey
{
  private OrderKey orderKey;
  private int itemIdex;

  ...
} 

そして、このような値:

public class OrderItem
{
  private ProductKey productKey;
  private int quantity;

  ...
}

OrderItems が 1 つのキャッシュにある場合、sProductが別のキャッシュにある場合。

分散キャッシュで適切に機能するモデルを取得したら、関連オブジェクトを同じ場所に配置し (同じ JVM に格納する)、参照オブジェクトをレプリケートする必要があります。

モデルに満足したら、オブジェクトを取り出して操作を実行するのではなく、オブジェクトが存在するキャッシュ ノードに処理を移動することを検討してください。これにより、ネットワーク負荷が軽減され、パフォーマンスが大幅に向上します。

于 2015-09-08T08:22:06.097 に答える
0

私がよく理解していれば、ディスクから大量のデータを読み取り、このデータをテスト目的でのみ使用する必要があります。

そのため、テストを実行するたびにテストをリロードする必要があり、テストが遅くなります。

このような場合は、メモリ上にディスク (RAM ディスク) を作成することもできます。したがって、ファイルは RAM の性能を備えたディスクに保存されます。

Linuxシステムで作成するためのコマンドramfsのリンクは次のとおりです

于 2015-09-08T08:22:47.163 に答える