我正在尝试将数据库表中包含的数据转换为一组三元组,因此我正在使用 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 上执行应用程序,所以我没有无限内存。有机会完成任务吗?也许有更有效的方法来存储模型?
最佳答案
默认格式是 RDF/XML 是一种漂亮的形式,但是要计算“漂亮”,在开始编写之前需要做很多工作。这包括建立内部数据结构。某些形状的数据需要做大量的工作来搜索“最漂亮”的变体。
漂亮形式的 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
。
关于java - 无法用 Jena 编写大型 owl 文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47719028/