0

私はJava Webアプリケーションで働いています。一部のセクションでは、メモリ (RAM) に保存して永続化する非常に巨大なツリー変数を使用しています。これを仮想メモリ (スワップ) に移行できますか? 注:巨大なツリーは、提案Ajaxテキストボックスで使用するすべてのユーザーの名前と電子メールで構成されています。

4

6 に答える 6

3

Linux にはメモリ ブロックを強制的にスワップする標準的な方法がないため、JVM には OS にそのようなタスクの実行を要求する方法がありません。

この機能が必要な場合にできる最善の方法は、ツリーをシリアル化し、生データをディスク ファイルに書き込み、準備ができたら元に戻すことです。

しかし、ディスクへの書き込みは物理メモリの I/O に比べて非常に遅いため、おそらくこれは望ましくありません。

適切な例として、OSにこれを心配させてください。あなたよりも優れたメモリ管理方法を知っていると仮定しても安全です。

于 2009-10-01T21:40:21.337 に答える
1

ディスクにアイテムを保存することはひどく非効率的であると同時に、データベース、おそらくディスクにデータを保存するリモートデータベースを使用することを勧めていることを誰もが彼に言っているのは興味深いことです。

スワップファイルを盲目的に処理する場合、将来がどうなるかを知っているコードの影響を受けてスワップファイルを処理するよりも、システムの方が効率的であると想定しています。システムがメモリ内のすべてのアイテムを調べてその一部をそのファイルに効率的に配置しようとするよりも、しばらく使用されないことがわかっているメモリをスワップアウトする方がはるかに効率的です。

もちろん、間違っていても、あなたはある程度正しいです。ローカルデータベースは、データをファイル(書き込みと読み取りが行われる場所)に格納するための最も効率的な方法です。ローカルデータベースにアクセスできない場合は、コードを作成してください。ハッシュマップはメモリに格納されるように設計されており、順序付けされたインデックス付きリンクリストはディスクに格納されるように設計されています。両方のメディアの効率を考慮せずに、メモリからディスクに直接プッシュしようとしても効果的ではありません。

于 2010-02-18T16:07:28.470 に答える
1

OS は自動的に独自のメモリを管理し、必要に応じてスワップファイルにプッシュします。

大量のデータがある場合は、巨大なメモリ内ツリーではなく、データベースにデータを格納することを検討してください。これにより、おそらくアプリケーションのスケーリングが向上し、パフォーマンスも向上する可能性があります。レコードを検索または変更する必要があるときはいつでも、構造全体をディスクに読み書きするよりも確実にパフォーマンスが向上します。

編集: 必ずしも専用のデータベース マシンをセットアップする必要はありません。現在、すべてのデータをメモリに保存しようとしている場合、サイズ制限がそれぞれ 16 GB と 2Tb のHSQLDBSQLiteなどの組み込み可能なデータベースを使用できる可能性があります。

于 2009-10-01T21:40:38.357 に答える
0

同じ問題の別の見方として、これはどうでしょうか。私はサーバー側で多くの PDF を作成しています。通常、月の同じ時間にレポートを実行したいクライアントが数十から数千あります。PDF の平均サイズは 7 ~ 10Mb です。利用可能な有限ヒープを使用して、データを一時ファイルに「スワップ」することは、PDF データをクライアントにストリーミングする前に応答でコンテンツの長さを設定できる必要があるため、PDF を作成する有効な方法です。

おそらく、設計に疑問を呈するだけでなく、いくつかの便利なオプションが便利かもしれません. 個人的には、プロセスごとに1つの一時ファイルを使用するか、単一の「スワップ」ファイルに同時アクセスすることを検討しています。

何を提案しますか?

于 2010-08-17T21:34:25.387 に答える