私はPythonを初めて使用し、ラズベリーパイでスクリプトを起動して実行し、何百万ものセンサーデータレコードをsqliteにインポートしています。プロセスをより効率的にするために、トランザクションでこれを行いたいです。ここで行ったように、トランザクションを 10k チャンクに分割しようとしています: Python CSV to SQLite
これまでのところ、
import csv, sqlite3, time
def chunks(data, rows=10000):
for i in range (0, len(data), rows):
yield data[i:i+rows]
if __name__ == "__main__":
t = time.time()
con = sqlite3.connect('test.db')
cur = con.cursor()
cur.execute("DROP TABLE IF EXISTS sensor;")
cur.execute("CREATE TABLE sensor(key INT, reading REAL);")
filename = 'dummy.csv'
reader = csv.reader(open(filename,"r"))
divdata = chunks(reader)
for chunk in divdata:
cur.execute('BEGIN TRANSACTION')
for col1, col2 in chunk:
cur.execute('INSERT INTO sensor (key, reading) VALUES (?, ?)', (col1, col2))
con.execute('COMMIT')
Python 3.2.3 で次のエラーが発生します。
Traceback (most recent call last):
File "/home/pi/test1.py", line 20, in <module>
for chunk in divdata:
File "/home/pi/test1.py", line 4, in chunks
for i in range (0, len(data), rows):
TypeError: object of type '_csv.reader' has no len()
すべて(基本的な挿入)がチャンクとトランザクションなしで正常に機能するため、私は明らかにチャンク部分のどこかを台無しにしています。どんな助けでも感謝します。