[英]Wordlist generator, heap size error in Java
我正在尝试创建一个程序,该程序基于几个(10-100)个原始输入单词来生成单词列表。 最终结果包含数百万行,可能数十亿行,每行一个字。 我已经走了足够远的距离,可以生成大约500万个左右的单词,但是每当我运行将生成更多词的东西(例如1亿左右)时,该程序在大约1分9秒后崩溃。 这是错误输出:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:265)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:231)
at java.util.ArrayList.add(ArrayList.java:462)
at wordlistgen.WordlistGen2.combineWords(WordlistGen2.java:129)
at wordlistgen.WordlistGen2.main(WordlistGen2.java:25)
/home/NAME/.cache/netbeans/8.1/executor-snippets/run.xml:53: Java
returned: 1
BUILD FAILED (total time: 1 minute 9 seconds)
我试图通过在netbeans.conf文件(运行Ubuntu 17.10)中输入-J-Xms1024m -J-Xmx2048m来增加Netbeans的堆大小,但是错误仍然存在。
该程序实质上是导入原始的10-100个字:
static void importList() throws IOException{
ArrayList<String> rawList = new ArrayList<>();
try(BufferedReader br = new BufferedReader(new FileReader("textfile"))) {
for(String line; (line = br.readLine()) != null; ) {
rawList.add(line);
}
listOfLists.add(rawList);
loll++;
}
}
然后,使用一堆for循环,用大写字母,末尾数字,整个单词的子字符串等创建单词的新变体。 单词存储在不同的数组列表中,而数组列表又存储在ArrayLists的ArrayList中。 因此在ArrayList中。
完成组合和操作单词后,使用以下方法将整个最终的arraylist逐行输出到输出文件:
static void outputFile(String fileName) throws IOException{
try (FileWriter writer = new FileWriter(fileName)) {
for(String str: finalList) {
writer.write(str +"\n");
}
}
}
完整的代码可以在这里找到: https : //pastebin.com/0fkvwYbx
我希望我遗漏了一些明显的东西,或者我错误地解释了错误消息,无论哪种方式,如果有人可以找到解决方案以便我能够生成更长的列表,我将非常感谢。
也许ArrayList不是您问题的适当List实现。 请参阅: 何时在ArrayList上使用LinkedList?
我认为您在(引用)时经常遇到最坏的情况
add(E element)被分摊为O(1),但O(n)最坏的情况是因为必须调整数组大小并复制它
由于您不断需要ArrayLists的重复大型后备阵列,因此不仅效率低下,而且内存效率低下。 考虑使用LinkedList,特别是因为您的代码似乎没有通过索引对列表进行随机访问
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.