【问题标题】:NegativeArraySizeException ANTLRv4NegativeArraySizeException ANTLRv4
【发布时间】:2014-06-15 00:39:24
【问题描述】:

我有一个 10gb 的文件,我需要用 Java 解析它,而当我尝试这样做时会出现以下错误。

java.lang.NegativeArraySizeException
        at java.util.Arrays.copyOf(Arrays.java:2894)
        at org.antlr.v4.runtime.ANTLRInputStream.load(ANTLRInputStream.java:123)
        at org.antlr.v4.runtime.ANTLRInputStream.<init>(ANTLRInputStream.java:86)
        at org.antlr.v4.runtime.ANTLRInputStream.<init>(ANTLRInputStream.java:82)
        at org.antlr.v4.runtime.ANTLRInputStream.<init>(ANTLRInputStream.java:90)

我怎样才能正确解决这个问题?如何调整这样的输入流来处理这个错误?

【问题讨论】:

    标签: java exception large-files antlr4


    【解决方案1】:

    看起来 ANTLR v4 有一个普遍的硬连线限制,即输入流大小小于 2^31 个字符。消除此限制并非易事。

    查看ANTLRInputStream 类的源代码 - here

    如您所见,它尝试将整个流内容保存在单个 char[] 中。那是行不通的……对于巨大的输入文件。但简单地通过在更大的数据结构中缓冲数据来解决这个问题也不是答案。如果您进一步查看文件,还有许多其他方法使用int 作为索引流的类型。需要将它们更改为使用 long ... 并且更改会产生影响。

    我怎样才能正确解决这个问题?如何调整这样的输入流来处理这个错误?

    我想到了两种方法:

    • 创建您自己的支持大型输入文件的 ANTLR 版本。这是一个不平凡的项目。我希望 32 位的假设会延伸到 ANTLR 生成的代码等中。

    • 在尝试解析输入文件之前将它们拆分为较小的文件。这是否可行取决于输入语法。

    我的建议是第二种选择。 “支持”大型输入文件(通过内存缓冲)的问题在于,它效率低下且浪费内存……而且最终无法扩展。

    您也可以创建问题here,或在antlr-discussion 上提问。

    【讨论】:

      【解决方案2】:

      我从来没有偶然发现这个错误,但我猜你的数组变得太大并且它的索引溢出(例如,整数环绕并变成负数)。使用另一种数据结构,最重要的是,不要一次加载所有文件(改用延迟加载,这意味着只加载正在访问的那些部分)

      【讨论】:

        【解决方案3】:

        希望对http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html有帮助

        您可能需要某种缓冲区来读取大文件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多