繁体   English   中英

单词列表生成器,Java中的堆大小错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM