我正在尝试将数据库表中包含的数据转换为一组三元组,因此我正在使用Jena java库编写一个owl文件。 我已成功完成了少量的表记录(100),对应于.owl文件中的近20,000行。我很满意。
要编写owl文件,我使用了以下代码(m
是OntModel
对象):
BufferedWriter out = null;
try {
out = new BufferedWriter (new FileWriter(FILENAME));
m.write(out);
out.close();
}catch(IOException e) {};
不幸的是,当我尝试对表的整个结果集(800.000记录)执行相同操作时,eclipse控制台向我显示异常:
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
引发了异常
m.write(out);
我绝对确定模型已正确填充,因为我试图在不创建owl文件的情况下执行程序,并且一切正常。
为了解决这个问题,我尝试在-Xmx4096M
中增加堆内存设置run->configuration->vm arguments
,但错误仍然存在。
我正在macbook上执行应用程序,所以我没有无限的内存。有机会完成任务吗?也许有更有效的方式存储模型?
答案 0 :(得分:6)
默认格式是RDF / XML是一种非常好的形式,但要计算"漂亮",在开始编写之前需要做很多工作。这包括建立内部datstructures。一些形状的数据导致相当广泛的工作要做,以寻找最美丽的"变异。
漂亮格式的RDF / XML是最昂贵的格式。即使是漂亮的海龟形式也更便宜,但它仍然涉及一些准备计算。
以更简单的格式编写RDF / XML,没有复杂的漂亮功能:
RDFDataMgr.write(System.out, m, RDFFormat.RDFXML_PLAIN);
输出流是首选,输出将是UTF-8 - " new BufferedWriter (new FileWriter(FILENAME));
"将使用平台默认字符集。
有关其他格式和变体,请参阅文档:
https://jena.apache.org/documentation/io/rdf-output.html
,例如RDFFormat.TURTLE_BLOCKS
。