Python+SQLite+Dockerで処理速度やファイルサイズを検証した

Nov 13, 2022 11:35 · 1389 words · 3 minute read Python Docker SQL

とあるイベントで同僚が「データを起点として仮説検証のサイクルを回すのは楽しいぞ」という話をしていました。 興味がでたので、データを使った仮説検証を自分でも試してみようと思います。

大量のデータを扱う前に今回は下記の検証をしたので、結果をブログに残しておきます。

  • 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を使うのもアリですが、まずは手軽にローカルでデータの操作や仮説検証を試してみようと思います。

tweet Share