Wordlist生成器,Java中的堆大小错误

时间:2018-04-13 14:16:45

标签: java heap-memory word-list

我正在尝试创建一个基于一对(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

我希望我遗漏了一些显而易见的东西,或者我错误地解释了错误信息,无论哪种方式,如果有人能够找到解决方案以便我能够生成更长的列表,我将非常感激。

1 个答案:

答案 0 :(得分:0)

也许ArrayList不是适用于您的问题的List实现。请参阅:When to use LinkedList over ArrayList?

我认为你在(引用)

时经常遇到最糟糕的情况
  

add(E element)是O(1)摊销,但是O(n)自阵列以来的最坏情况   必须调整大小并复制

不仅在时间上效率低下,而且在内存中也是如此,因为您经常需要为ArrayLists提供重复的大型后备阵列。考虑使用LinkedList,特别是因为您的代码似乎没有通过索引对列表进行随机访问