나는 내가 다른 곳에서 발견 한 관용구를 사용하여 함께 병합하기 위해 노력하고있어 3 개 테이블 각각 32 SQLite는 (3.7.9) 데이터베이스를 가지고있다 (각 DB는 동일한 스키마를 가지고) :SQLite 데이터베이스를 병합하면 나를 미치게 만듭니다. 도움?
attach db1.sqlite3 as toMerge;
insert into tbl1 select * from toMerge.tbl1;
insert into tbl2 select * from toMerge.tbl2;
insert into tbl3 select * from toMerge.tbl3;
detach toMerge;
및 전체 데이터베이스 세트에 대해 헹굼 반복. - 900K 행 제 (tbl3)은, 약 850보다 큰 상태에서 테이블
for fn in filelist:
completedb = sqlite3.connect("complete.sqlite3")
c = completedb.cursor()
c.execute("pragma synchronous = off;")
c.execute("pragma journal_mode=off;")
print("Attempting to merge " + fn + ".")
query = "attach '" + fn + "' as toMerge;"
c.execute(query)
try:
c.execute("insert into tbl1 select * from toMerge.tbl1;")
c.execute("insert into tbl2 select * from toMerge.tbl2;")
c.execute("insert into tbl3 select * from toMerge.tbl3;")
c.execute("detach toMerge;")
completedb.commit()
except sqlite3.Error as err:
print "Error! ", type(err), " Error msg: ", err
raise
2, dB 당 비교적 작은 만 50K 행이다 :이 사용 파이썬 및 sqlite3를 모듈을한다. 이제는 네 번째 데이터베이스에 가까워 질 때까지 인서트가 점차적으로 느려지 게됩니다 (결합 된 데이터베이스에 1-3 분마다 추가 된 파일 크기에서 메가 바이트 또는 두 개의 순서로). 그것은 파이썬 경우에, 심지어 INSERTs (.insert; .out foo; sqlite3 complete.dbfoo가 골격이며, here을 찾았습니다.) 테이블을 덤프 해보고 sqlite3 CLI를 사용하여 bash 스크립트에서 결합했습니다. 직접 작업을 수행하지만 정확히 동일한 문제가 발생합니다.
tbl3의 테이블 설정은 UUID, 2 개의 정수 및 4 개의 실제 값을 포함하는 텍스트 필드가 지나치게 까다로운 것은 아닙니다. 내 걱정은 개별 데이터베이스가 같은 수의 행을 가진 파일 크기의 측면에서 더 큰 순서 인 경우 똑같은 문제 (정확하게 네 개의 데이터베이스가 있음)에서 똑같은 문제가 발생했기 때문에 행 수가 있다는 것입니다. (원시 데이터 대신 요약 통계를 저장하여 tbl3의 내용을 상당 부분 정리했습니다). 아니면 내가 작업을 수행하는 방식일까요? 누군가 창문 밖으로 물건을 던지기 전에 내가 가지고있는이 문제에 대해 밝혀 줄 수 있습니까?
마이클, 답변 주셔서 감사합니다. 다시 : 귀하의 질문, 나는 OS X Lion과 Rocks 클러스터 (5.3)의 헤드 노드에서 시도했습니다. 앞서 언급했듯이 문제는 데이터베이스 파일 크기와 별개입니다. 현재 화신에서는 각각 160Mb이지만 문제는 각각 1.6Gb 였을 때와 똑같은 방식으로 발생했습니다. 다시 제안 : 나는 c.close() 및 completedb.close()를 사용하기 전에 시도했지만이 코드에서 벗어났습니다. 문제가 해결되지 않았습니다. 필자도 CLI를 사용하여 수동으로이 작업을 시도해 보았습니다. 시작, 연결, 병합, 종료, 각 파일 반복 등을 시도했습니다. 불운. – Winawer