Apache Jenaで大量のRDFトリプルをTDB(2)にバルクロードする

2 分で読める

tdbloader2を使って大量のRDFトリプルをロードするとき、インデクシングフェーズで大きな一時ファイルが作成されるため、/tmpの容量不足で失敗することがあります。

$ tdbloader2 --jvm-args "-Xmx8g" --loc /path/to/database *.ttl
INFO  Total: 98,355,483 tuples : 4,089.41 seconds : 24,051.26 tuples/sec [2019/03/22 04:15:47 JST]
 04:15:48 INFO Data Load Phase Completed
 04:15:48 INFO Index Building Phase
 04:15:48 INFO Creating Index SPO
 04:15:48 INFO Sort SPO
sort: write failed: /tmp/sortvNPO1J: No space left on device
 04:18:36 ERROR Failed during data phase

Apache JenaJENA-1003: tdbloader2 reports df: `’: No such file or directory

こちらを見ると、TMPDIRという環境変数を設定することでtmpディレクトリを指定できるようです。

$ export TMPDIR=/path/to/tmp_dir/
$ tdbloader2 --jvm-args "-Xmx8g" --loc /path/to/database *.ttl

これで無事ロードも終わり、さてFusekiを起動しようと思ったところ…

Server     ERROR Exception in initialization: caught: File size (1852784650) not a multiple of blocksize (8192)

というエラーが出て小一時間悩んでいたのですが、tdbloader2はTDB2ではなくTDB用のツールだったんですね。コマンド名に"2"と付いているのでTDB2のデータベースが作成されると誤解して、TDB2としてロードしようとしたために発生したエラーでした。

TDB2用のコマンドラインツールは以下のページにあるように、“tdb2.“で始まるコマンドです。

Apahce Jena: TDB2 - Command Line Tools

今更TDBを使う理由もないので、tdb2.tdbloaderを使ってやり直します。

$ tdb2.tdbloader --loc /path/to/database *.ttl

そこそこマシンスペックがあるなら--loader=parallelを指定してやると、多少処理が早くなります。

comments powered by Disqus