こんにちは、Java api を使用して tdb の作成中に格納されているトリプルの数を確認できますか? turtle で rar ファイルを使用して TDB ファクトリを実行していますが、ディレクトリにファイルを作成している間、格納されているトリプルの数を確認できません。どうすればこの問題を解決できますか?
1 に答える
0
次のように、(導入されたトリプルを表示するために) Java コードを介してバルクローダーにアクセスできます。
final Dataset tdbDataset = TDBFactory.createDataset( /*location*/ );
try( final InputStream in = /*get input stream for your large file*/) {
TDBLoader.load( ((DatasetGraphTransaction)tdbDataset.asDatasetGraph()).getBaseDatasetGraph() , in, true);
}
アーカイブに複数のファイルがある場合 (簡単にするために、rar ではなく zip を実行します)、この質問への回答に従って、渡す前にファイルを 1 つのファイルに連結することで最適化されたパフォーマンスを得ることができます。それらをバルクローダーに。すべてのトリプルが導入されるまでインデックスの作成を遅らせることで、パフォーマンスが向上します。サポートされているフォーマットは他にもあると思いますが、テストしたのはN-TRIPLES
.
次の例では、ストリームのコピーにIOUtils
fromを使用しています。commons-io
final Dataset tdbDataset = TDBFactory.createDataset( /*location*/ );
final PipedOutputStream concatOut = new PipedOutputStream();
final PipedInputStream concatIn = new PipedInputStream(concatOut);
final ExecutorService workers = Executors.newFixedThreadPool(2);
final Future<Long> submitter = workers.submit(new Callable<Long>(){
@Override
public Long call() throws Exception {
long filesLoaded = 0;
try( final ZipFile zipFile = new ZipFile( /* Archive Location */ ) {
final Enumeration< ? extends ZipEntry> zipEntries = zipFile.entries();
while( zipEntries.hasMoreElements() ) {
final ZipEntry entry = zipEntries.nextElement();
try( final InputStream singleIn = zipFile.getInputStream(entry) ) {
// If your file is in a supported format already
IOUtils.copy(singleIn, concatOut);
/*(final Model m = ModelFactory.createDefaultModel();
m.read(singleIn, null, "lang");
m.write(concatOut, "N-TRIPLES");*/
}
filesLoaded++;
}
}
concatOut.close();
return filesLoaded;
}});
final Future<Void> comitter = workers.submit(new Callable<Void>(){
@Override
public Void call() throws Exception {
TDBLoader.load( ((DatasetGraphTransaction)tdbDataset.asDatasetGraph()).getBaseDatasetGraph() , concatIn, true);
return null;
}});
workers.shutdown();
System.out.println("submitted "+submitter.get()+" input files for processing");
comitter.get();
System.out.println("completed processing");
workers.awaitTermination(1, TimeUnit.SECONDS); // NOTE this wait is redundant
于 2014-09-18T14:11:37.773 に答える