メモ_できるだけメモリを節約しながらGB超のcsvファイルをSQLiteに読み込ませる

手元マシンのVM上のUbuntuに10GBのメモリを割り当てた環境での話ですが、2GB超のcsvファイルをpandasで読み込ませて、そこから更にSQLiteにも展開とかしていたらメモリ不足で落ちてしまったので、できるだけメモリを節約しながらSQLiteに読み込ませるコードのメモ。

 

コード

以下のコードで2GB程度のcsv(約2000万行)を読み込む際の消費メモリが、1~2GB程度に抑えられた。Ubuntu自体が使うメモリが1GB程度なので、合計でも3GBくらい。chunksizeは100万としているけど、これを増やすと少し読み込みが早く終わる。ただし、chunksizeを増やした分、消費メモリも増える。


import sqlite3
import pandas as pd

# CSVファイルを分割して読み込む
chunksize = 1000000
for i, chunk in enumerate(pd.read_csv('******.csv', chunksize=chunksize)):
    # SQLiteに接続する
    conn = sqlite3.connect('******.db')

    # テーブルを作成する
    table_name = '******'
    if i == 0:
        chunk.to_sql(table_name, conn)
    else:
        chunk.to_sql(table_name, conn, if_exists='append')

    # 接続を閉じる
    conn.close()