Близко к производительности чтения серийного текстового файла в MySQL - PullRequest
1 голос
/ 10 декабря 2010

Я пытаюсь выполнить подсчет 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 ]

1 голос
/ 10 декабря 2010

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

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

0 голосов
/ 10 декабря 2010

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

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

Greetz, J.

0 голосов
/ 10 декабря 2010

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

...