2010-12-10 3 views
1

파이썬에서 n 그램 계산을하려고하는데 내 텍스트 데이터 구성에 MySQL (MySQLdb 모듈)을 사용할 수 있다고 생각했습니다.MySQL에서 직렬 텍스트 파일 읽기 성능에 가깝습니다.

고유 숫자 ID (자동 증가) 및 언어 varchar 필드 (예 : "en", "de", "es"등)로 인덱싱 된 문서를 나타내는 약 10mil 레코드가 꽤 큽니다. ..)

select * from table은 너무 느리고 메모리가 파괴적입니다. 내가 좋아하는 쿼리 하나 그 작은 레코드의 각 세트를 (각 2000 명 기록 넓은 말)보다 작은 범위로 전체 ID 범위를 분할하고 처리 결국 ... 등등

select * from table where id >= 1 and id <= 1999 
select * from table where id >= 2000 and id <= 2999 

MySQL에서보다 효율적으로 처리하고 큰 코퍼스 텍스트 파일을 순차적으로 읽는 것과 비슷한 성능을 얻을 수있는 방법이 있습니까?

레코드의 순서는 신경 쓰지 않고 큰 테이블에서 특정 언어와 관련된 모든 문서를 처리 할 수 ​​있기를 원합니다.

답변

1

HANDLER 문을 사용하여 테이블 (또는 색인)을 청크로 탐색 할 수 있습니다. 이것은 매우 이식성이 없으며 사용자가 열람하는 동안 행이 나타나고 사라지는 경우 트랜잭션이 "흥미로운"방식으로 작동합니다 (힌트 : 일관성을 얻지는 못하지만 일부 애플리케이션에서는 코드를 더 간단하게 만듭니다).

일반적으로 데이터베이스 서버가 시스템에 로컬 인 것처럼 성능에 영향을 주므로 메모리에 몇 개의 데이터 사본이 필요하고 다른 처리가 필요합니다. 이것은 피할 수없는 일이며, 실제로 당신을 괴롭히는 경우,이 목적으로 mysql을 사용하지 말아야한다.

+0

감사합니다. – Alexandros

0

쿼리를 필터링하는 데 사용하는 열 (ID는 이미 기본 키를 관리하고있는 언어 및 ID 일 가능성이 높습니다.), 아니요.

0

첫 번째 : 필요한 열 (이 경우 lang 및 doc)을 지정할 수 있으면 *를 사용하지 마십시오. 둘째 : 데이터를 자주 변경하지 않는 한, 특히 파일 이름을 저장하는 경우 데이터베이스에 모두 을 저장하는 것이 중요하지 않습니다. 예를 들어 xml 형식을 사용할 수 있습니다 (SAX API를 사용하여 읽고 쓸 수 있음)

DB보다 더 빠르게 MySQL을 사용하려는 경우 SQLite 또는 BerkeleyDb와 같은 메모리 내 데이터 베이직을 고려할 수 있습니다. 파이썬 바인딩.

Greetz, J.