2016-09-08 3 views
2

distancevertices 테이블을 포함하는 여러 테이블이있는 sqlite 데이터베이스 (11GB)가 있습니다. distance 테이블은 꽤 크고 (120mio 행), vertices은 더 작습니다 (15,000 행). 나는 의 한 칼럼을 vertices의 다른 칼럼의 값으로 업데이트하기 위해 파이썬에서 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 번의 업데이트가 필요하십니까? 어떻게 그 파이썬/sqlite에서 할 것이라고?

답변

2

이 같은 문장으로 덩어리를 업데이트 할 수 있어야한다 :

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

여러 트랜잭션을 사용할 필요가 없습니다; 실제로 메모리에 보관해야하는 유일한 것은 단일 명령문에서 갱신 될 행 목록입니다. (이론적으로, 메모리가 부족하면 적절한 오류 메시지가 나타납니다. 실제로는 일부 OS는 overcommit memory이고 너무 늦을 때까지는 응용 프로그램에 알려주지 않습니다.)

+0

비슷한 문제에 대한 해결책. 큰 데이터베이스를 업데이트 할 때 SQLite3이 충돌하는 이유에 대한 아이디어가 있습니까? –