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 到 size - 1 的所有元素都必须移动:从逻辑上讲,索引 n 处的项目被移动到索引 n-1。如果您查看source ArrayList您会看到有一个 System.arrayCopy 调用来执行此操作。您报告要执行的操作所花费的时间听起来像是存在更深层次的问题,但您可以尝试使用LinkedList或重新设计您的算法,以便从列表末尾而不是前面删除元素。使用 a LinkedList,头元素被删除,其他节点都不需要修改。如果您坚持ArrayList但每次都删除最后一个元素而不是第一个元素,则不需要 arrayCopy。

另外,看看Guava 的Multimap. 它在逻辑上是Map带有 aCollection的值,就像你在这里一样,但它是一个更好的界面。Guava 库中还有许多其他令人惊叹的类,如果你还没有使用它们,你也应该检查一下!

于 2012-08-26T23:53:04.953 回答
0

谢谢,我恢复了 LinkedList 并从最后删除,现在只需 4 秒即可读取跟踪。

编辑:从最后恢复和删除并没有改变结果,我犯了一个错误。只是使用 LinkedList 而不是 ArrayList 解决了我的问题。

于 2012-08-27T01:14:54.947 回答