我正在尝试创建大的RDF / HDT文件,这反过来又意味着将大文件读入内存等。现在,这并不是什么大问题,因为服务器具有516GB的内存,其中大约510GB可用。 / p>
我正在使用rdfhdt库来创建文件,效果很好。但是,对于一个特定的文件,我一直收到OutOfMemoryError,没有真正的原因。这是堆栈跟踪:
Exception in thread "main" java.lang.OutOfMemoryError
at java.io.ByteArrayOutputStream.hugeCapacity(ByteArrayOutputStream.java:123)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:117)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at org.rdfhdt.hdt.util.string.ByteStringUtil.append(ByteStringUtil.java:238)
at org.rdfhdt.hdt.dictionary.impl.section.PFCDictionarySection.load(PFCDictionarySection.java:123)
at org.rdfhdt.hdt.dictionary.impl.section.PFCDictionarySection.load(PFCDictionarySection.java:87)
at org.rdfhdt.hdt.dictionary.impl.FourSectionDictionary.load(FourSectionDictionary.java:83)
at org.rdfhdt.hdt.hdt.impl.HDTImpl.loadFromModifiableHDT(HDTImpl.java:441)
at org.rdfhdt.hdt.hdt.writer.TripleWriterHDT.close(TripleWriterHDT.java:96)
at dk.aau.cs.qweb.Main.makePredicateStores(Main.java:137)
at dk.aau.cs.qweb.Main.main(Main.java:69)
我正在运行带有标签-Xmx200G
的Jar文件。奇怪的是,当在“ top”中查看时,它显示VIRT为213G(按预期)。但是,每次RES攀升至大约94GB时,都会因上述错误而崩溃,我认为这很奇怪,因为它应该还有100GB以上的空间可以使用。我看了this问题,因为问题似乎与我的相似,尽管规模不同。但是,使用-verbose:gc
和-XX:+PrintGCDetails
似乎并不能给我任何提示,而且大约还有500G的交换空间可用。
但是,也许最奇怪的是我遇到的特定文件甚至不是最大的文件。从规模上看,它可以写入约8300万个三元组,而对于其他文件,最多2亿个三元组就不是问题。我正在使用Java版本1.8.0_66和Ubuntu版本14.04.3 LTS。
所以我的问题是,是否有人可以解释我做错了什么?大文件没有问题,对我来说似乎很奇怪,但是这个文件确实有问题。如果您需要其他任何信息,请告诉我。
答案 0 :(得分:4)
由于Java的最大数组长度,ByteArrayOutputStream不能容纳超过2GB的数据。无论您当前的RAM数量或内存限制如何,都是如此。这是the code you're hitting:
apiVersion: batch/v1
kind: Job
metadata:
name: primes
spec:
template:
metadata:
name: primes
spec:
containers:
- name: primes
image: ubuntu
command: ["bash"]
args: ["-c", "current=0; max=70; echo 1; echo 2; for((i=3;i<=max;)); do for((j=i-1;j>=2;)); do if [ `expr $i % $j` -ne 0 ] ; then current=1; else current=0; break; fi; j=`expr $j - 1`; done; if [ $current -eq 1 ] ; then echo $i; fi; i=`expr $i + 1`; done"]
restartPolicy: Never
您将不得不重写代码,以免将那么多数据保留在单个数组中。