我正在尝试创建大型RDF/HDT文件,这反过来意味着将大文件读入内存等等.现在,这不是一个问题,因为服务器有516GB的内存,大约510GB是免费的.
我正在使用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)
Run Code Online (Sandbox Code Playgroud)
我正在运行带有标记的Jar文件-Xmx200G.奇怪的是,当查看"顶部"时,它显示VIRT为213G(如预期的那样).然而,每次RES爬升到大约94GB时,它会因上面的错误而崩溃,我认为这很奇怪,因为它应该剩下100GB以上才能使用.我查看了这个问题,因为问题似乎与我的相似,尽管规模不同.然而,使用-verbose:gc和 - XX:+PrintGCDetails似乎没有给我任何关于什么是错误的指示,并且还有大约500G的交换空间可用.
然而,也许最奇怪的是,我遇到的特定文件甚至不是最大的文件.对于规模,它有大约83M三倍的写入,而对于其他文件,高达200M的三元组不是问题.我使用的是Java版本1.8.0_66和Ubuntu版本14.04.3 LTS.
所以我的问题是,如果有人能解释我做错了什么?对我来说似乎很奇怪,较大的文件没有问题,但是这个文件没有问题.如果您需要任何其他信息,请与我们联系.
我对 C++ 很陌生,我遇到了一个我似乎无法解决的问题,也无法找到其他有同样问题的人。
我有一个Polynomial定义的类:
template<class C>
class Polynomial {
std::vector<C> coefficients;
...
public:
...
const double integral(double, double);
...
};
Run Code Online (Sandbox Code Playgroud)
我需要确保,integral()如果C是整数类型,则无法调用该方法。显然,这意味着使用类型特征,但是我已经尝试template<typename = typename std::enable_if<!std::is_integral<C>::value, C>::type>在方法本身上使用,尽管它可以编译,但我现在无法使用整数类型作为模板参数创建对象。
然后我想,应该可以创建Polynomial类的部分特化,即具有浮点的类的特化,一个是整数,一个是复数。类似的东西
template<typename C>
class Polynomial<typename std::enable_if<std::is_floating_point<C>::value, C>::type> : Polynomial<C> {
public:
const double integral(double, double);
};
Run Code Online (Sandbox Code Playgroud)
然而,不管我怎么做,它似乎永远不会奏效。
我想我的问题是:如何使用类型特征作为特化来指定类的部分特化?
我希望你能帮忙。