2013-07-25 3 views
3

저는 SQLite3 데이터베이스에 큰 일괄 처리 삽입을하고 있는데 실제로 기대하고있는 것과 어떤 성능이 필요한지에 대한 감각을 얻으려고합니다.python과 sqlite3을 사용한 insert 성능

cursor.execute(
      "CREATE TABLE tweets(
      tweet_hash TEXT PRIMARY KEY ON CONFLICT REPLACE, 
      tweet_id INTEGER, 
      tweet_text TEXT)" 
     ) 

을 내 삽입은 다음과 같이 :

내 표는 다음과 같습니다

cursor.executemany("INSERT INTO tweets VALUES (?, ?, ?)", to_write) 

to_write는 튜플의 목록입니다.

현재 데이터베이스에 약 1,200 만 개의 행이 있으며 50 000 개의 행을 삽입하면 약 16 분이 걸리고 2008 macbook에서 실행됩니다.

이 소리가 합리적인가요? 아니면 어떤 일이 발생 했습니까?

+0

는 각 쿼리에서 여러 값을 삽입하는 시도? 매우 큰 문자열을 만들어야하기 때문에 한 번에 모든 문자열이 아니라 각각 100 개가 될 수 있습니다. 내 경험으로 이것은 삽입 속도를 훨씬 향상시킵니다. –

+0

@GustavLarsson :'executemany'는 쿼리를 준비하고 행당 열 *을 이미 스트리밍하는 것을 이용해야합니다. –

+0

@GustavLarsson : 어떻게 여러 삽입물을 제안하셨습니까? 'execute()'와'executemany()'는 * one 문만 허용합니다. –

답변

5

나쁜 성능의 주된 이유는 많은 SQLite 트랜잭션을 저지해야 할 때입니다. 무엇을해야합니까?

다음, N 행의

PRAGMA synchronous = OFF (or NORMAL) 

삽입 블록 인덱스를 드롭 (N을 정의, N = 5000 시작하려고). 삽입 후

BEGIN TRANSACTION 

COMMIT 

참조해야합니까 블록을 삽입하기 전에 는 http://www.sqlite.org/faq.html#q19