java - setBuildParseTree = false 是否有任何好的引用示例?

标签 java out-of-memory antlr antlr4

我使用 antlr 作为简单的 CSV 解析器。我想在 29gig 文件上使用它,但 ANTLRInputStream 调用时内存不足:

    CharStream cs = new ANTLRInputStream(new BufferedInputStream(input,8192));
    CSVLexer lexer = new CSVLexer(cs);
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    CSVParser parser = new CSVParser(tokens);
    ParseTree tree = parser.file();
    ParseTreeWalker walker = new ParseTreeWalker();
    walker.walk(myListener, tree);

我尝试将其更改为无缓冲流

    CharStream cs= new UnbufferedCharStream(input)
    CSVLexer lexer = new CSVLexer(cs);
    lexer.setTokenFactory(new CommonTokenFactory(true));
    TokenStream tokens = new UnbufferedTokenStream(lexer);
    CSVParser parser = new CSVParser(tokens);

当我运行 walker.walk() 函数时,它不会处理任何记录。如果我尝试类似的事情

    parser.setBuildParseTree(false);
    parser.addParseListener(myListener);

它也失败了。如果不构建解析树,我似乎必须以不同的方式解析文件,因此我想要有关如何执行此操作的文档或示例。

如果我不使用无缓冲的字符流,但我使用无缓冲的 token 流,则会出现错误:无缓冲的流无法知道其大小。我尝试了不同的排列,但通常会出现 java 堆错误或“超出 GC 开销限制”。

我正在使用this csv grammar

最佳答案

我已经在这里回答了类似的问题:https://stackoverflow.com/a/26120662/4094678

It seems like I have to parse the file differently if I don't build a parse tree, so I would like documentation or examples of how to do this.

在antlr书中查找语法操作 - 就像链接答案中所说的那样,忘记监听器和访问者并构建解析树。即使这还不够,也可以将文件拆分为多个较小的文件,然后解析每个文件。
当然,正如评论中提到的,增加 java vm 内存。

关于java - setBuildParseTree = false 是否有任何好的引用示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36602692/

相关文章:

Java 套接字文件传输 - 文件传输不完全

android - 使用多个线程下载图像会导致 OutOfMemory 异常

c# - ANTLR - 为 AST 编写树语法

antlr - 在范围和语法错误中使用 float ?

java - ExecutorService 和 OutOfMemoryError : unable to create new native thread while using Executor

tree - Antrl3条件树重写

java - 将 View 部分与 servlet 代码分离

java - 使用 Firefox 的 IPlanet 中的小程序(未找到类)

java - 关于事务管理的问题

android - 使用 LruCache 并避免 OutOfMemoryException