2012-08-26 65 views
3

我在读取内存跟踪时遇到问题。我已经阅读并保存地图remove()方法太慢

地图结构上的网页和他们的参考:

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)); 
    } 
引用

问题是,删除这些引用需要很长时间,而对于大量的痕迹来说,删除引用需要几个小时。有人有另一种解决方案吗?

谢谢!

+0

你使用了什么'List'的实现? – cheeken

+0

对不起,它的一个ArrayList实现 –

+0

谢谢你,我恢复了LinkedList,并从最后删除,现在只需要4秒钟来读取跟踪。 –

回答

3

我认为,如果remove(0)是唯一的删除操作,你会作出这个列表中的LinkedList的是一个更好的数据结构上:

尝试:

Map<Integer, LinkedList<Integer>> map = new HashMap<Integer, LinkedList<Integer>>(); 
+0

奇怪的是,使用LinkedList并没有改变时间.. –

+0

对不起,ID DID更改时间。我的踪迹从17分钟到10分钟。不幸的是,我需要它更快。但是,谢谢你的提示! ;) –

+1

@FelipeCarminati 10min删除LinkedList的头部?我很确定这种方法没有缓慢。列表中有多少个元素? – Strelok

1

如果该列表是非常很大,问题可能是索引1到索引1中的所有元素都必须移动:逻辑上,索引n处的项目移动到索引n-1。如果您看到the ArrayList source,您可以看到有一个System.arrayCopy调用来执行此操作。您报告要执行的操作的时间量使其听起来像是存在更深层次的问题,但您可以尝试使用LinkedList或重新使用算法,以便从列表末尾而不是前面删除元素。使用LinkedList时,head元素被删除,并且其他节点都不需要修改。如果你坚持使用ArrayList,但每次删除最后一个元素而不是第一个元素,则不需要arrayCopy。

另外,看看Guava's Multimap。这在逻辑上是Map,其值为Collection,就像你在这里一样,但它是一个更好的接口。 Guava图书馆还有许多其他惊人的课程,你还应该检查一下,如果你还没有使用它们!

+0

使用LinkedList没有任何区别(因为它应该),我会尝试颠倒列表顺序,然后像你说的那样从结尾删除。谢谢! –

+0

对不起,ID DID更改时间。我的踪迹从17分钟到10分钟。不幸的是,我需要它更快。 –

+0

访问文件将比从“LinkedList”中删除节点或从“ArrayList”中删除最后一个元素慢得多。你确定你看到的速度确实是由于删除列表而不是文件访问? 此外,请尝试在'BufferedReader'中尝试缓冲区的大小,或者根本不指定大小并使用默认大小。 –

0

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

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