我希望找到更有效的方法来从大型数据集中传输RDF四元组/三元组。我一直在使用RDFDataMgr.parse(rdfStream, datasetLocation);
和RDFParser.source(datasetLocation).parse(rdfStream);
,但是当数据集增长时,这两种解决方案都会受到影响。我做了一个实验,看看RDFDataMgr花了多长时间来解析不同大小的数据集。我考虑过:300000,500000,1000000,5000000,7500000,10000000作为基础,然后是182011590(真实数据集)。处理是线性的,但确实需要花费很多时间。每个数据集大小的平均时间如下:
300000 - 4421.1ms 500000 - 7184.6ms 1000000 - 14431.6ms 5000000 - 71926.3ms 7500000 - 116375.7ms 10000000 - 148588.8ms
平均而言,解析器每秒解析68265.38333三倍。此数字基于所有测试数据集的基准测试平均值。考虑到300k三元组需要解析~4s,这实际上非常耗时。
PipedRDFIterator和PipedRDFStream初始化如下:
int buffer = (int) (size * 0.10); PipedRDFIterator iterator = new PipedRDFIterator(buffer, true, 50 , 10000); PipedRDFStream rdfStream = new PipedTriplesStream((PipedRDFIterator) iterator); ExecutorService executor = Executors.newSingleThreadExecutor();
正如预期的那样,较大的数据集(182011590三倍)需要更多时间,1450001毫秒(约24分钟)。有趣的是,解析器平均每秒解析125525三倍。
我理解那里解析不只是从文件中读取并转储它,但它包括语法检查等...但是,有没有任何方法或任何Jena解析器可以加快解析时间?
我希望这对你有用。
谢谢!
编辑:我使用以下VM参数运行这些基准测试:3.1 GHz Intel Core i5上的-Xmx10g -Xms8g,2133 MHz RAM,2133 MHz和SSD驱动器