Python+SQLite+Dockerで処理速度やファイルサイズを検証した
Nov 13, 2022 11:35 · 1389 words · 3 minute read
とあるイベントで同僚が「データを起点として仮説検証のサイクルを回すのは楽しいぞ」という話をしていました。 興味がでたので、データを使った仮説検証を自分でも試してみようと思います。
大量のデータを扱う前に今回は下記の検証をしたので、結果をブログに残しておきます。
- SQLite3に大量のデータを追加した場合、DBファイルサイズはどのくらいになるのか?
- Dockerコンテナからホストマシン上のDBファイルを更新をした場合、どれくらいの時間がかかるのか?
目次
検証環境
今回はPython公式のDockerイメージを使ってSQLite3のDBファイルを操作します。 下記のコマンドでDockerコンテナを起動しました。
docker container run -it --name python_sqlite --mount type=bind,source="$(pwd)"/src/,target=/mnt --rm python:3.10.8-slim-bullseye bash
なぜSQLite?
Google Colaboratoryを使う記事を見ていると、データはCSV形式で扱うのが一般的なようです。 まずはローカルでデータを整形したり図示してみたかったので、下記のメリットがあるSQLiteを試してみようと考えました。
- 複数種類のデータを1ファイルにまとめて管理できる
- SQLが使えるので、目的のデータを取り出しやすい(はず)
DBファイルのサイズ検証
まずは2件のデータを追加します。
import sqlite3
dbname = 'test.db'
conn = sqlite3.connect(dbname)
cur = conn.cursor()
cur.execute('CREATE TABLE sample1(id INTEGER PRIMARY KEY AUTOINCREMENT, a1 INTEGER, a2 INTEGER, a3 INTEGER, a4 INTEGER, a5 INTEGER, a6 INTEGER)')
sql = 'INSERT INTO sample1 (a1, a2, a3, a4, a5, a6) values(?, ?, ?, ?, ?, ?)'
data = [
(101, 102, 103, 104, 105, 106),
(201, 202, 203, 204, 205, 206),
]
cur.executemany(sql, data)
conn.commit()
conn.close()
2件のデータを入れた場合、ファイルサイズは12KBでした。5件に増やした場合も変わらず12KB。 テーブルが空の状態でも12KBだったので、12KBくらいがSQLite DBファイルサイズの下限のようです。
今度はテーブル数を100まで増やしてみます。
import sqlite3
def main():
dbname = 'test2.db'
conn = sqlite3.connect(dbname)
cur = conn.cursor()
for i in range(1, 101):
cur.execute('CREATE TABLE sample%s(id INTEGER PRIMARY KEY AUTOINCREMENT, a1 INTEGER, a2 INTEGER, a3 INTEGER, a4 INTEGER, a5 INTEGER, a6 INTEGER)' % i)
sql = 'INSERT INTO sample%s(a1, a2, a3, a4, a5, a6) values(?, ?, ?, ?, ?, ?)' % i
data = [
(101, 102, 103, 104, 105, 106),
(201, 202, 203, 204, 205, 206),
(301, 302, 303, 304, 305, 306),
(401, 402, 403, 404, 405, 406),
(501, 502, 503, 504, 505, 506),
]
cur.executemany(sql, data)
conn.commit()
conn.close()
if __name__ == '__main__':
main()
このときのDBファイルのサイズは424KB。
ここから更にテーブルの数を10,000まで増やすと、DBファイルのサイズは41MBになりました。
これだけの数のテーブルやデータを入れても41MBに収まるのであれば、SQLiteでデータを管理するのもアリですね。
DB操作の実行時間
WSL2からWindowsファイルシステム上のファイルを読み書きした場合に、処理が異常に遅くなったことがありました。
DockerコンテナからホストマシンにあるDBファイルを操作した場合も遅くなるのでしょうか?
前述のサンプルコードでDBファイルに10,000のテーブルを作成した場合、実行時間は10秒かからない程度でした。 数万件程度のデータを操作するのであれば、現実的な時間で処理できるのではないでしょうか。
最後に
SQLiteに数万件程度のデータを追加した場合の、「DBファイルのサイズ」と「実行時間」を検証しました。
初めからGoogle Colaboratoryを使うのもアリですが、まずは手軽にローカルでデータの操作や仮説検証を試してみようと思います。