ChatGPTに1000万行のテスト用DBを作成してもらいました。大きなデータを扱う際、いきなり本番データをいじるのは怖いとき、大体のサイズや処理負荷をつかむために、テストDBを立てることがありますが、そういう想定です。
指示文(プロンプト):
10カラムからなるテーブルを作成して、ランダムな8桁の数字で1000万レコード文のデータを生成してデータベースに格納するPythonコードを作成してください。DBはSQLiteにしてください。
回答:
import sqlite3
import random
# データベースに接続
conn = sqlite3.connect('sample.db')
cur = conn.cursor()
# テーブルを作成
cur.execute('''CREATE TABLE IF NOT EXISTS sample_table
(col1 INTEGER, col2 INTEGER, col3 INTEGER, col4 INTEGER, col5 INTEGER,
col6 INTEGER, col7 INTEGER, col8 INTEGER, col9 INTEGER, col10 INTEGER)''')
# 1000万行のデータを生成して挿入
for i in range(10000000):
row_data = []
for j in range(10):
row_data.append(random.randint(10000000, 99999999)) # 8桁のランダムな数字を生成
cur.execute('INSERT INTO sample_table VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', row_data)
# コミットして接続を閉じる
conn.commit()
conn.close()
結果:
以下のように成功しました。作成にかかる時間計測部分は手動で追加してます。データをいったんPandassに展開してます。DBのサイズは585MBでした。
追記:
SQLiteとPandasでデータを扱う際、どのくらい速度差があるのでしょうか。扱うデータ次第なので一概には言えませんが、普通の感覚では高速なのはPandasですが、ちょっと気になったので計測してみたところ、結果は以下でした。
ランダムに10万行分のデータを取り出して、すべての値を合計する処理を比較
SQLiteeから直で操作した場合の処理時間:7.423秒
Pandasで操作した場合の処理時間:4.587秒