3

メモリ トレースの読み取りに問題があります。私はそれを読み、ページとその参照を地図に保存しました

マップ構造:

    Map<Integer, List<Integer>> map = new HashMap<>();

そして、ファイルを再度読み取り、整数リストから参照を削除します

FileReader arq = new FileReader(new File(Path));
BufferedReader reader = new BufferedReader(arq, 41943040);
while ( (std = reader.readLine()) != null ) {
        requestedPage = Integer.parseInt(std, 16);
        //do something
        M.map.get(requestedPage).remove(0));
    }

問題は、これらの参照を削除するのに時間がかかりすぎることと、大きなトレースの場合、参照を削除するのに何時間もかかることです。誰にも別の解決策がありますか?

ありがとうございました!

4

3 に答える 3

3

remove(0)このリストに対して行う唯一の削除操作である場合、LinkedList の方がはるかに優れたデータ構造であると思います。

試す:

Map<Integer, LinkedList<Integer>> map = new HashMap<Integer, LinkedList<Integer>>();
于 2012-08-26T23:47:54.417 に答える
1

リストが非常に大きい場合、インデックス 1 からサイズ - 1 までのすべての要素をすべて移動する必要があるという問題が発生する可能性があります。論理的には、インデックス n の項目はインデックス n-1 に移動されます。sourceを見るとArrayListこれを行うための System.arrayCopy 呼び出しがあることがわかります。必要な操作を報告している時間は、より深い問題があるように聞こえますが、アルゴリズムを使用するLinkedListか、アルゴリズムを再加工して、リストの先頭ではなく末尾から要素を削除することができます。を使用するLinkedListと、head 要素が削除され、他のノードを変更する必要はありません。ArrayList最初の要素ではなく最後の要素を毎回削除する場合は、arrayCopy は必要ありません。

また、グアバのMultimap. ここにあるように、論理的には値のMapaCollectionですが、はるかに優れたインターフェイスです。Guava ライブラリには他にもたくさんの素晴らしいクラスがあり、まだ使用していない場合はチェックする必要があります。

于 2012-08-26T23:53:04.953 に答える
0

ありがとうございます。LinkedList を元に戻し、最後から削除しました。今では、トレースを読み取るのに 4 秒しかかかりません。

編集:最後から元に戻して削除しても結果は変わりませんでした。私は間違いを犯しました。ArrayList の代わりに LinkedList を使用するだけで問題が解決しました。

于 2012-08-27T01:14:54.947 に答える