2019年12月16日月曜日

Embulk で sqlite 3 にバルクロードしようとすると失敗することがある

概要

大量のデータを sqlite3 にバルクロードするのに Embulk を使うのは不向きっぽい。

環境

  • Windows 10 64bit
  • Embulk ver.0.9.20
  • SQLite ver.3.30.1
  • embulk-output-sqlite3 (0.0.1)
  • jdbc-sqlite3 (3.28.0)

実行

少量のデータなら問題なさそう。
大量のデータをバルクロードすると、以下のエラーメッセージが出力される。


Error: java.lang.RuntimeException: org.sqlite.SQLiteException: [SQLITE_BUSY]  The database file is locked (database is locked)
                

DBがロックされて、処理出来なくなったとのこと。
きちんと調べたわけではないが、以下の特性があるので 仕方がないのかとも思う。

  • Embulk はバルクロードを並列処理している。
  • SQLite は並列処理が苦手。

対応策

SQLite にデータをロードするならば コマンドラインツールの「.import」コマンドを使った方がいい。
取り込みたいファイルの形式が「.import」コマンドに対応していないのであれば、Embulkで変換してやればいい。