Apache Jenaで大量のRDFトリプルをTDB(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.“で始まるコマンドです。
今更TDBを使う理由もないので、tdb2.tdbloaderを使ってやり直します。
$ tdb2.tdbloader --loc /path/to/database *.ttl
そこそこマシンスペックがあるなら--loader=parallel
を指定してやると、多少処理が早くなります。