我正在尝试将数据库表中包含的数据转换为一组三元组,因此我正在使用 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/

10-13 02:41