超出JAVA HashMap高效替代/ GC开销限制

时间:2013-12-17 17:35:31

标签: java map garbage-collection out-of-memory

对于我遇到的这个问题,我有几个问题。我读了一些其他问题,我发现问题在于我正在生成数十万个小地图(Map<mutableObject, String>)。

  1. 我没有提到问题,hy是否会发生这种情况?我想了解幕后发生的事情。所以,如果有人在这里有指针,我们将不胜感激。

  2. 第二个问题与什么是使用HashMap的好方法有关。每个地图彼此不同,但大多数元素都有很多重复。我正在生成字符串的排列,我将它们存储在地图中。有人有一个很好的解决方案,如果可能的话,还有一个指针,可以理解为什么我应该这样做?

  3. 提前致谢

    Altober

    确定这里有一些代码给那些要求的人。我正在阅读一个XML文件,我试图尽可能地减少它,以便您可以了解正在发生的事情。

    String s = null;
    String wd = null;
    SomeObject word = null;
    List<Sentence> sentences = new ArrayList<Sentence>();
    Sentence sentence = null;
    String line = null;
    while(in.hasNextLine()) {
        line = in.nextLine().trim();
        if((line.startsWith("<s>")) {
           sentence = new Sentence();
           senses = new HashMap<someObject, String>();
        } else if(line.endsWith("</f>")) {
            int beggin = line.indexOf('>');
            wd = line.substring(beggin + 1, line.length() - 5);
            word.word = wd;
            if(s != null)
                 senses.put(word, s);
        } else if if(line.endsWith("</s>")) {
            sentence.setSenses(senses);
            sentences.add(sentence);
        }
    
    }
    

    已解决(此处为解决方案)

    使用内存分析器后,我发现问题不是地图,而是我在循环中生成的大量字符串(每个标记都有多个属性)。因为文件是字符串排列的结果,所以有很多重复的字符串。我只使用.intetn()作为suggested in another post的每个字符串,然后它就能顺利运行。

2 个答案:

答案 0 :(得分:1)

  

我正在制作成千上万的小地图(地图)。

     
      
  1. 我没有提到问题,为什么会这样?我会   喜欢了解幕后发生的事情。所以,如果有人   这里有一个指针,我将不胜感激。
  2.   

这不是真的发生在幕后。它就在你的代码中:

while(in.hasNextLine()) {
...
    if((line.startsWith("<s>")) {
        sentence = new Sentence();
        senses = new HashMap<someObject, String>(); // <-- generating a new HashMap
...
}

另外,确切地说,它为<s>的每次出现生成一个,不一定是几十万个。

答案 1 :(得分:0)

你产生了多少种排列?百万?十亿?

如果有30,000种可能的排列,那么你的问题就是其他问题。但是,一旦数量变得足够大,即使您正在有效地执行此操作,“普通”台式计算机也不可能存储所有结果。

如果你这是作为学校作业的一部分而做的,通常其中一个要点就是让你意识到这一点:)

Google'组合爆炸'了解更多内容 - 这是来自维基百科页面:

http://en.wikipedia.org/wiki/Combinatorial_explosion

For example, 100! = 9.33262154 × 10157, a number so large that it cannot be displayed on most calculators, and vastly larger than the estimated number of fundamental particles in the Universe.

如果您认为自己是成功运行程序的,那么您可以尝试更改JVM选项并增加可用堆大小。然而,通常的情况是,当试图解决这类问题时,你不需要两倍的内存......而是你需要100-10,000,000倍的内存。

您是否能够使用较小版本的问题成功运行程序?如果是这样,你应该研究程序开始失败的输入大小。