我有一个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)
如何正确解决此问题?如何调整此输入流以处理此错误?
答案 0 :(得分:2)
看起来ANTLR v4具有普遍的硬连线限制,输入流大小小于2 ^ 31个字符。删除此限制不是一项小任务。
查看ANTLRInputStream
课程的源代码 - here。
如您所见,它会尝试将整个流内容保存在单个char[]
中。对于巨大的输入文件,它不会起作用。但是,通过在更大的数据结构中缓冲数据来简单地解决这个问题也不是解决问题的方法。如果您向下看文件,有许多其他方法使用int
作为索引流的类型。他们需要更改为使用long
...并且更改将会消失。
如何正确解决此问题?如何调整此输入流以处理此错误?
我想到了两种方法:
创建自己的ANTLR版本,支持大型输入文件。这是一个非平凡的项目。我希望32位假设能够进入ANTLR生成的代码等等。
在尝试解析输入文件之前将其拆分为较小的文件。这是否可行取决于输入语法。
我的推荐是第二种选择。 &#34;支持&#34;的问题巨大的输入文件(通过内存缓冲)是低效率和内存浪费......它最终不会扩展。
您还可以创建问题here,或在antlr-discussion上提问。
答案 1 :(得分:0)
我从来没有偶然发现这个错误,但我猜你的数组太大而且它的索引溢出(例如,整数包围并变为负数)。使用另一种数据结构,最重要的是,不要一次加载所有文件(改为使用延迟加载,这意味着只加载那些被访问的部分)
答案 2 :(得分:-1)
我希望这会有助http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html
您可能希望使用某种缓冲区来读取大文件。