2016-09-08 13 views
2

テーブルdistanceverticesを含む複数のテーブルを持つsqliteデータベース(アプリケーション11 GB)があります。テーブルdistanceはかなり大きいです(120 mioの行)、verticesは小さいです(15000行)。私はのある列をverticesの別の列の値で更新するために、Pythonでsqlite3を使用したいと思います。テーブルの頂点には、列catのインデックスとorig_catの別のインデックスがあります。私がやっている何大規模なsqliteデータベースをチャンクで更新する

import sqlite3 
db_path='path/to/db.db' 

conn = sqlite3.connect(db_path) 
cur = conn.cursor() 

cur.execute('''UPDATE distance SET 
       from_orig_v = (SELECT orig_cat FROM vertices WHERE cat=distance.source)''') 

をしかし、このような大規模なデータベースにその更新ステートメントを実行し、メモリエラーが発生します。クラッシュするまでメモリ使用量は着実に増加しています。メモリを使い果たしずにこのような大きな更新ステートメントを実行するようアドバイスしたいのですが?おそらく、チャンク(例えば、distanceの表の行)で更新を処理し、 1000メモリの空き更新?どのようにそれはPython/sqliteで行われるだろうか?

答えて

2

このようなステートメントでチャンクを更新することが可能でなければなりません:

UPDATE distance SET ... WHERE rowid BETWEEN 100000 AND 200000; 

あなたが複数のトランザクションを使用する必要はありません。実際にメモリ内に保持されなければならないのは、単一のステートメントで更新される行のリストだけです。 (理論的には、メモリが不足している場合は、適切なエラーメッセージが表示されます)実際には、一部のOSはovercommit memoryであり、遅すぎるまでアプリケーションに通知しないでください)。

+0

私はこれを同様の問題に対する解決策。大きなデータベースを更新する際にSQLite3がクラッシュする理由についてのアイデアはありますか? –

関連する問題