Java后缀Trie超出堆空间

标签 java data-structures suffix-tree

我正在实现一个后缀特里树(这与后缀树不同),它将字符串的字符后缀存储为树结构中的节点,其中字符串是通过遍历树直到击中“$”或您已完成搜索。

问题在于,在使用大型文本文件时,构造此 trie 比 Java 消耗更多内存。就数据结构而言,有什么地方可以减少内存使用吗?这是家庭作业,并不需要使其成为压缩后缀树(基本上是后缀树)。

这是我目前拥有的基本结构(如果您确实需要,我可以提供实现细节):

//SuffixTrie.java

public class SuffixTrie {
    private SuffixTrieNode root = new SuffixTrieNode();

    // implementation of insertions into tree etc..


    public static void main(String[] args) throws FileNotFoundException {   
        String fileName = "Frankenstein.txt";
        SuffixTrie st = readInFromFile(fileName);
        String[] ss = {"without","hideous", "the only", "onster", ", the", "ngeuhhh"};
        for (String s: ss) {
            SuffixTrieNode sn = st.get(s);
            System.out.println("[" + s + "]: " + sn);
        }
    }
}

每个节点是:

// SuffixTrieNode.java
public class SuffixTrieNode {
    private char label; // Indicates the letter for this node
    private boolean isTerminal = false;
    private SuffixTrieData data;
    private HashSet<SuffixTrieNode> children; 
 // Inserting adds more SuffixTrieNodes to the children of the node

每个节点保存的数据为:

public class SuffixTrieData {
    private ArrayList<Pair> startIndexes = new ArrayList<Pair>();

    public SuffixTrieData(int sentence, int index){
        addStartIndex(sentence, index);
    }   
    public class Pair{
        public int sentence;
        public int index;
        public Pair(int sentence, int index){
            this.sentence = sentence;
            this.index = index;
        }
    }
}

我得到的错误是:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.ArrayList.<init>(Unknown Source)
    at java.util.ArrayList.<init>(Unknown Source)
    at SuffixTrieData.<init>(SuffixTrieData.java:7)
    at SuffixTrie.insert(SuffixTrie.java:20)
    at SuffixTrie.insert(SuffixTrie.java:11)
    at SuffixTrie.readInFromFile(SuffixTrie.java:77)
    at SuffixTrie.main(SuffixTrie.java:89)

不过,它对于较小的文本文件来说效果很好,这是他们第一次给学生布置这项作业,因此教师不知道这是否可以使用后缀特里树来实现。

最佳答案

后缀特里树将仅用于单词(字母)就使用大量空间。此外,您似乎正在存储该单词出现的每个句子的数组以及索引(您发布的代码不完整,如果我错了,请纠正我)。如果文件相当大......这将占用一些空间。

您可以做的一件事是在存储时压缩句子,并在检索它们时使用 deflate/inflate 解压缩。

除此之外,您可能希望在运行进程时使用 -Xmx 选项(例如 java -Xmx 2GB -jar myJarFile.jar )。

关于Java后缀Trie超出堆空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7297571/

相关文章:

algorithm - 在大型数据集中查找最长公共(public)子串

java - 什么被认为是最好的 Java 后缀树实现?

java - 从 VisualVM 理解堆图

编译因 [Error] ld 返回 1 退出状态而失败

c++ - C++ 数据结构对象的生命周期是多少?

c++ - STL priority_queue 的效率

java - 以编程方式在 Android Facebook 应用程序中打开 Facebook 帖子 URL

java - SWT - 我可以自定义绘制文本控件的背景吗?

java - 如何比较两个纳米时间值? [javadoc 困惑]

algorithm - 如何以及何时在后缀树中创建后缀链接?