概要
大量のデータを 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で変換してやればいい。
-
GitHub - embulk/embulk: Embulk: Pluggable Bulk Data Loader.
https://github.com/embulk/embulk -
GitHub - takady/embulk-output-sqlite3: SQLite3 output plugin for embulk
https://github.com/takady/embulk-output-sqlite3 -
SQLITE_BUSY
公式の SQLLITE_BUSY に関するドキュメント
https://www.sqlite.org/rescode.html#busy -
CSV Import
公式のCSVインポートに関するドキュメント
TSVインポートにも応用可能
https://www.sqlite.org/cli.html#csv
-
あさはか備忘録: SQLite3 CSVデータを取り込む、CSVデータを出力する
https://sfnovicenotes.blogspot.com/2019/09/csvsqlite3-dbinsertselect-csv-csvrfc.html