Близко к производительности чтения серийного текстового файла в MySQL

Я пытаюсь выполнить подсчет n-грамм в Python, и я подумал, что мог бы использовать MySQL (модуль MySQLdb) для организации моих текстовых данных.

У меня есть довольно большая таблица, около 10 миллионов записей, представляющих документы, которые индексируются уникальным числовым идентификатором (автоинкремент) и языком varchar поле (например, "en", "de", "es" и т. д.)

select * from table слишком медленный и память разрушительна. В итоге я разделил весь диапазон идентификаторов на более мелкие диапазоны (скажем, по 2000 записей в каждой) и обработал каждый из этих меньших наборов записей один за другим с помощью следующих запросов:

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

и так далее...

Есть ли способ сделать это более эффективно с MySQL и добиться такой же производительности, как при последовательном чтении большого текстового файла корпуса?

Меня не волнует порядок записей, я просто хочу иметь возможность обрабатывать все документы, которые относятся к определенному языку в моей большой таблице.

3 ответа

Решение

Вы можете использовать оператор HANDLER для обхода таблицы (или индекса) порциями. Это не очень переносимо и работает "интересно" с транзакциями, если строки появляются и исчезают во время просмотра (подсказка: вы не получите согласованности), но упрощает код для некоторых приложений.

В общем, вы получите снижение производительности, как если бы ваш сервер баз данных был локальным по отношению к компьютеру, потребуется несколько копий данных (в памяти), а также некоторая другая обработка. Это неизбежно, и если это действительно беспокоит вас, вы не должны использовать mysql для этой цели.

Помимо определения индексов для любых столбцов, которые вы используете для фильтрации запроса (язык и идентификатор, вероятно, там, где в идентификаторе уже есть индексная обработка первичного ключа), нет.

Первое: вам следует избегать использования *, если вы можете указать нужные столбцы (в данном случае lang и doc). Второе: если вы не меняете свои данные очень часто, я не вижу смысла хранить все это в базе данных, особенно если вы храните имена файлов. Например, вы можете использовать формат xml (и читать / писать с SAX API)

Если вам нужна БД и что-то более быстрое, чем MySQL, вы можете рассмотреть базу данных в памяти, такую ​​как SQLite или BerkeleyDb, которая имеет обе привязки python.

Greetz, J.

Другие вопросы по тегам