필자는 약 1.7m 라인의 스프레드 시트를 가지고 있으며 총 1GB이며 다양한 쿼리를 수행해야합니다. 파이썬에 가장 익숙한 첫 번째 방법은 내가 작성하려고했던 쿼리를 쉽게 수행 할 수있는 방법으로 입력 된 사전들을 함께 해킹하는 것이 었습니다. 예 : 특정 지역 번호와 나이를 가진 모든 사람들에게 접근 할 수 있어야한다면, 나는 areacode_age 2 차원 사전을 만들 것입니다. 나는 이들 중 상당수가 필요하게되어 결국 메모리 용량 (10GB 정도)이 늘어 났으며,이를 지원할만큼 충분한 RAM이 있더라도 프로세스는 여전히 느려졌다.합리적인 시간에 파이썬에서 (매우) 큰 관계형 데이터를 쿼리하고 있습니까?
이 시점에서, 나는 빨판 게임을하고있는 것처럼 보였습니다. "글쎄요, 관계형 데이터베이스가 만들어 졌죠?"라고 생각했습니다. sqlite3을 가져 와서 내 데이터를 메모리 데이터베이스로 가져 왔습니다. 나는 데이터베이스가 속도를 위해 만들어졌으며 이것이 내 문제를 해결할 것이라고 추측한다.
"SELECT (a, b, c) FROM foo WHERE date1 < = d AND date2> e AND name = f"와 같은 쿼리를 수행하는 데는 0.05 초가 걸립니다. 내 1.7m 행에 대해이 작업을 수행하려면 24 시간의 계산 시간이 필요합니다. 사전을 사용한 나의 해킹 접근법은이 특정 작업에 대해 약 3 배 더 빨랐습니다. (이 예에서는 date1과 date2를 입력 할 수 없었으므로 이름이 일치하고 날짜별로 필터링하는 모든 행을 얻었습니다.)
내 질문은 왜 이렇게 느린 지, 어떻게 빨리 만들 수 있습니까? Pythonic 접근 방식은 무엇입니까? 가능성은 내가 생각해 왔던 :
- sqlite3를 너무 느리게, 나는 어떻게 든 최적화 ... 내 스키마 또는 내 쿼리가 더로 변경해야
- 더 헤비급 뭔가가 필요?
- 나는 지금까지 시도한 접근법이 완전히 잘못되어 어떤 새로운 도구가 필요하다.
- sqlite 3에서 cursor.execute를 반복적으로 호출하면 커서를 사용하는 것보다 훨씬 느리다. 경영진. executemany는 select 문과도 호환되지 않는다는 것이 드러났습니다. 그래서 이것은 빨간 청어라고 생각합니다.
감사합니다.
170 만 개의 행이 있기 때문에 170 만 번 쿼리해야한다고 말하고 있습니까? – gahooa
간단한 숫자 쿼리 만 수행하고 조인 등이 필요하지 않은 경우 'pytables'를보십시오. http://www.pytables.org/moin –