对于我遇到的这个问题,我有几个问题。我读了一些其他问题,我发现问题在于我正在生成数十万个小地图(Map<mutableObject, String>
)。
我没有提到问题,hy是否会发生这种情况?我想了解幕后发生的事情。所以,如果有人在这里有指针,我们将不胜感激。
第二个问题与什么是使用HashMap的好方法有关。每个地图彼此不同,但大多数元素都有很多重复。我正在生成字符串的排列,我将它们存储在地图中。有人有一个很好的解决方案,如果可能的话,还有一个指针,可以理解为什么我应该这样做?
提前致谢
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的每个字符串,然后它就能顺利运行。
答案 0 :(得分:1)
我正在制作成千上万的小地图(地图)。
- 我没有提到问题,为什么会这样?我会 喜欢了解幕后发生的事情。所以,如果有人 这里有一个指针,我将不胜感激。
醇>
这不是真的发生在幕后。它就在你的代码中:
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倍的内存。
您是否能够使用较小版本的问题成功运行程序?如果是这样,你应该研究程序开始失败的输入大小。