3

答えを探しましたが、私の質問に 100% 答えられるものは見つかりませんでした。:D
したがって、ハッシュマップから他の 3 つの新しい hasmaps を作成し、その値の 2 つを 3 つの異なる方法で交換する必要があります (私は使用map2.putAll(map1)し、後で 2 つの値を切り替えます)。それらの1つを選択して、プロセスを繰り返します。

特別な条件が満たされていないため、これを何度も行わなければならないため、問題が始まります...そして、私が行うマップの数を減らす方法はありません(まあ、複製されたものをブロックするかもしれませんが、非常に高価だと思います:/)。

実際、すべてのマップを何らかの方法で保存するかどうか (私が読んだことから、それは GC の障害であることがわかりました)、または他のトリックを実行する必要があるかどうかはあまり気にしません... (可能であれば) 「-XX:-UseGCOverheadLimit」のようなものを使用します。これは一種の宿題であり (マークがなくても)、プロンプトから「Java クラス名」で動作する必要があるためです。

唯一の制限は時間通りです (これは問題ではなく、100% 確実であり、既にテストされています)、単純な入力 (既に良好です) だけでテストされますが、できるようにしたいと思います。難しいこともする。

アドバイスよろしくお願いします。

ああ、マップはこのようなもので、<Integer,Integer>サイズは16です。残念ながら、宿題がまだ終わっていないので、ここにコードを投稿することはできません (私のものを提出したとしても)。

4

3 に答える 3

1

コードで何が起こっているかを説明から正確に判断するのは困難ですが、マップの割り当てと破棄のメモリ オーバーヘッドが原因である場合は、Map インスタンスをキャッシュして再利用することができます。いくつかのオブジェクト プーリングの実装を使用するか、周囲に負荷がかかるか、スレッドが 1 つしかない場合は Stack をオブジェクト プールとして使用します。

あなたが抱えているもう1つの問題は、Integerを使用すると大量のメモリチャーンが発生することです。Integerは不変であるため、少し面倒です。Map をTrove int/intマップに置き換えると、ソートされます:)

于 2013-02-01T20:02:39.407 に答える
0

HashMap はメモリの点で高価です。大規模なデータセットからすばやく検索する必要がある場合にのみ使用してください。「かつサイズが 16 である」ということは、ハッシュマップがまったく必要ないように見えます。

于 2012-12-03T06:11:16.060 に答える
0

あなたに与えられた仕事についてもう少し具体的に教えていただければ助かるかもしれませんが、これについて私の考えを述べさせてください。

まず第一に、Integer (クラス) と int (プリミティブ) の使用に大きな間違いはないはずです。より多くのメモリを使用しますが、それでも整数のみです。大量のトラックを積んでいない限り、問題に遭遇することはありません。HashMap についても同様です。コミュニティを信頼してください。HashMap に重大な問題があった場合は、今頃判明していたはずです。

メモリリークがあるように思えます。そのためにあなたのプログラムをチェックしてください。あなたはメモリ制限を上げたくないと言いますが (あなたが私に尋ねるのは賢明な決定です)、ただテストするためにこれを試すかもしれません。メモリ リークが発生した場合、プログラムの実行時間が少し長くなり、まったく同じ問題が発生します。メモリ リークを検出するための専用ツールがありますが、標準の Windows プロセス マネージャーを使用して、プログラムのメモリ消費量を時間の経過とともに監視するだけで、リークがあるかどうかをすぐに明らかにできます。プログラムが同じことを何度も実行している場合、メモリ消費量は比較的安定していると予想できます。メモリが割り当てられ、ガベージ コレクターによって再び収集されるため、時間の経過とともに増減しますが、これはかなり安定した帯域幅内にとどまるはずです。

メモリ リークがないと確信している場合は、問題の解決方法が間違っている可能性があります。たとえば、ファイルを処理するための単純な実装では、ファイルをメモリに読み込み、処理してから再度保存する場合があります。ただし、ファイルが 1GB の場合、そのアプローチは、ロードされたデータを格納するためだけに 1GB のメモリを消費します。大量のデータを処理できるようにする必要がある場合は、一度に処理するのではなく、チャンクで処理します。ファイル データの一部をバッファに読み込み、処理し、処理されたデータを取り除き、次のチャンクを読み込みます。このようにして、アプリケーションはあらゆるサイズのファイルを処理できます。これは単なる例ですが、この種のものはメモリの問題の典型です。リークがあるか、アプローチが間違っています。巨大で大量のデータを処理するプログラムのみが、メモリの制限に達する必要があります。ほとんどのプログラムはそうではありません。メモリリークがあるか、問題にアプローチするために間違った方法を使用しているだけです。

于 2013-02-01T20:24:14.670 に答える