파이썬 2.7과 SQLite를 사용하고 있습니다. 수백만 행의 데이터베이스를 구축 중입니다. 가끔은 디스크에 쓰고 싶습니다. 아이디어가 있으면 성능이 향상 될 것입니다. 내 생각은 때때로 commit() 만 호출하는 것이었다. 나는 아래의 코드로 그것을 시도했다. 중간에있는 선택은 일관된 읽기를 얻는다는 것을 보여줍니다. 그러나 디스크를 보면 파일 example.db-journal이 표시됩니다. 데이터가 캐시되는 위치 여야합니다. 어떤 경우에 이것은 성능 측면에서 아무 것도 얻지 못할 것입니다. 인서트를 메모리에 모으고 디스크로 플러시 할 수있는 방법이 있습니까? 이 작업을 수행하는 더 좋은 방법이 있습니까?메모리에있는 Python SQLite 캐시
이import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('CREATE TABLE if not exists stocks (date text, trans text, symbol text, qty real, price real)')
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
t = ('RHAT',)
c.execute('SELECT date, symbol, trans FROM stocks WHERE symbol=?', t)
# Here, we get 2 rows as expected.
print c.fetchall()
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
conn.commit()
t = ('RHAT',)
c.execute('SELECT date, symbol, trans FROM stocks WHERE symbol=?', t)
# Here, we get all the rows as expected.
print c.fetchall()
conn.close()
업데이트 : 나는 경우 누구의 일부 코드를 업데이 트를 줄 것이다
체격이 문제에 걸쳐 실행
여기 내 예제 코드입니다. 텍스트 파일에서 5 백만 줄을 처리 중이며 더 많은 처리를 위해 데이터를 저장할 위치가 필요했습니다. 나는 원래 모든 데이터를 메모리에 가지고 있었지만 메모리가 부족했습니다. 그래서 디스크 캐쉬를 위해 SQLite로 전환했습니다. 원래 메모리에 처리 버전은 원래 텍스트 파일에서 50,000 행당 ~ 36 초가 걸렸습니다.
측정이 끝나면 SQLite 버전의 배치 처리에 대한 첫 번째 단절은 5 만 줄에 대해 ~ 660 초가 걸렸습니다. 코멘트 (포스터 덕분에)을 바탕으로, 다음 코드를 내놓았다 :
self.conn = sqlite3.connect('myDB.db', isolation_level='Exclusive')
self.cursor.execute('PRAGMA synchronous = 0')
self.cursor.execute('PRAGMA journal_mode = OFF')
또한, 내 텍스트 파일에서 처리 1000 개 선 후 커밋합니다.
if lineNum % 1000 == 0:
self.conn.commit()
이렇게하면 텍스트 파일의 50,000 줄에 ~ 40 초가 소요됩니다. 그래서 전체 시간에 11 %를 더했지만 메모리는 일정합니다. 이것이 더 중요합니다.
대신 redis와 같은 메모리 저장소를 사용할 수 있습니다. – Pramod
정말 필요한 경우 (측정!), 메모리 내 sqlite DB (": memory :")를 사용하여 해당 내용을 디스크상의 DB로 주기적으로 덤프 할 수 있습니다. –