2013-08-13 3 views
13

사용 SQLite는에 거대한 데이터를 삽입 : Importing a CSV file into a sqlite3 database table using Python대량 나는이 읽기 파이썬

을하고 모든 사람이 한 줄 한 줄을 읽는 대신에 SQLite는에서 대량 .import를 사용하여 제안 것으로 보인다. 그러나 수백만 행의 데이터가 있으면 삽입 속도가 느려집니다. 이것을 피할 수있는 다른 방법이 있습니까?

업데이트 : 다음 코드를 한 줄씩 삽입하려고했지만 속도가 예상보다 좋지 않습니다. 단지 BEGIN 및 COMMIT로 삽입을 둘러싼하여 단일 트랜잭션에서 모두를 할 수 있는지 확인하십시오, 그것은

for logFileName in allLogFilesName: 
    logFile = codecs.open(logFileName, 'rb', encoding='utf-8') 
    for logLine in logFile: 
     logLineAsList = logLine.split('\t') 
     output.execute('''INSERT INTO log VALUES(?, ?, ?, ?)''', logLineAsList) 
    logFile.close() 
connection.commit() 
connection.close() 

답변

17

발전기 표현식을 사용하여 데이터를 즉시 조각으로 나누고 트랜잭션 내부에 삽입합니다. 여기 sqlite optimization FAQ에서 인용입니다 :

을 이미 트랜잭션에 각 SQL 문은 새로운 트랜잭션이 그것을 시작하지 않는 한. 각 문에 대해 재개, 쓰 기 및 저널 파일 닫기가 필요하기 때문에 이는 매우 비쌉니다. 이는 SQL 문 의 시퀀스를 BEGIN TRANSACTION으로 래핑하면 피할 수 있습니다. 및 END TRANSACTION; 진술. 이 속도 향상 은 데이터베이스를 변경하지 않는 명령문에 대해서도 얻을 수 있습니다.

Here's 코드의 모양

또한 sqlite의 능력은 import CSV files입니다.

+0

SQLite는 많은 CSV 파일을 한 번에 가져올 수 있습니까? 그렇게 할 수있는 방법을 찾지 못했습니까? – Shar

+0

한 번에 많은 csv 파일을 가져올 수 있다고 생각하지 마십시오. 청크로 데이터를 분할하고 트랜잭션에 삽입하는 방법이 있어야한다고 생각합니다. – alecxe

+0

감사합니다! 나는 그걸로 갈 것 같아. – Shar

14

SQLite는이 tens of thousands of inserts per second을 할 수있는 개선 어쨌든있다. (executemany()는 자동으로이 작업을 수행합니다.)

속도가 문제가된다는 것을 알기도 전에 항상 최적화하지 마십시오. 가장 쉬운 솔루션을 먼저 테스트하고 속도가 받아 들일 수없는 경우에만 최적화하십시오.

+0

고마워요! 나는 지금 당장 그것을 시도하고 속도에 대해보고 할 것이다. – Shar

+0

방금 ​​제안한 내용을 줄 단위로 삽입하여 시도해 보았습니다. 속도는 그렇게 나쁘지는 않지만, 내가 원하는만큼 빠르지는 않습니다. 어쩌면 내 코드가 충분히 잘 작성되지 않았을 수도 있습니다. 나는 위의 질문에서 그것을 업데이트했다. 의견 있으십니까? – Shar

23

이것은 Google 검색에서 가장 좋은 결과이므로이 질문을 업데이트하는 것이 좋습니다. python sqlite docs에서

당신은 내가 한 번에 5 만여 행 삽입을 저지하기 위해이 방법을 사용하고이 번개 빨리

import sqlite3 

persons = [ 
    ("Hugo", "Boss"), 
    ("Calvin", "Klein") 
] 

con = sqlite3.connect(":memory:") 

# Create the table 
con.execute("create table person(firstname, lastname)") 

# Fill the table 
con.executemany("insert into person(firstname, lastname) values (?,?)", persons) 

를 사용할 수 있습니다.

+1

메모리 데이터베이스로 sqlite를 사용하기 때문에 번개가 빠릅니다 ... – aramaki

+0

2 분 미만의 생성 작업을 줄였습니다! 그리고 그것은 파일 데이터베이스이기 때문에 어쨌든 번개입니다 – Math