我正在尝试创建一个基于一对(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中,而arraylists又存储在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
我希望我遗漏了一些显而易见的东西,或者我错误地解释了错误信息,无论哪种方式,如果有人能够找到解决方案以便我能够生成更长的列表,我将非常感激。
答案 0 :(得分:0)
也许ArrayList不是适用于您的问题的List实现。请参阅:When to use LinkedList over ArrayList?
我认为你在(引用)
时经常遇到最糟糕的情况add(E element)是O(1)摊销,但是O(n)自阵列以来的最坏情况 必须调整大小并复制
不仅在时间上效率低下,而且在内存中也是如此,因为您经常需要为ArrayLists提供重复的大型后备阵列。考虑使用LinkedList,特别是因为您的代码似乎没有通过索引对列表进行随机访问