Python для индексации и поиска с использованием кластера? - PullRequest
2 голосов
/ 28 сентября 2010

После неудачного несчастного случая с MySQL я, наконец, отказался от его использования.

Что у меня есть?

Большой набор файлов в следующем формате:

ID1: String String String String
ID2: String String String String
ID3: String String String String
ID4: String String String String

Что я сделал?

Использовал MySQL на мощной машине для импорта всего в базу данных в следующем виде:

ID1 String
ID1 String
ID1 String
ID1 String
...
...

Что случилось?

Импорт базы данныхБыл успешен.Индексирование не выполняется, поскольку очевидно, что для 2 миллиардов записей требуется более 200 ГБ.Разумный запрос, но у меня просто не так много места, потому что сама таблица после нормализации занимает около 240 ГБ.

Что я планирую сделать?

Iиметь кластер из 20 узлов с доступом около 80 ГБ для всех вместе взятых (все они имеют монтирование NFS).Я настраиваю узлы для распределенных вычислений, используя Parallel Python .Я планирую переписать свою логику, чтобы использовать мощность кластера.

Мой вопрос:

Мне нужно выполнить множество следующих типов поиска:

Какие идентификаторы содержат данную строку?

Например, если дана произвольная строка: «String1», мне нужно знать, что говорят, что «ID1, ID2234» содержат ее.

На данный момент мне известны два метода:

  • Использование вызова python grep
  • Каждый из 20 узлов получает контроль над набором файлов и по запросудля поиска, ищет связанные с ними файлы.

Может кто-нибудь предложить хороший подход для ускорения этой неэффективной в противном случае задачи?

Ответы [ 2 ]

1 голос
/ 28 сентября 2010

Для требования поиска, какие идентификаторы связаны с данной строкой, я предлагаю инвертировать отношение идентификатор / строка, чтобы записи кодировались уникальными строками, а связанные данные представляли собой последовательность идентификаторов. Поиск строки может быть реализован либо с помощью двоичного поиска, если он отсортирован, либо с помощью алгоритма хеширования. Это может значительно сконцентрировать ваши данные, если вы повторяете много одинаковых строк.

0 голосов
/ 28 сентября 2010

Я бы посоветовал взглянуть на использование нереляционной базы данных для поддержки этого. Существует несколько хранилищ ключей / значений, которые вы можете использовать для хранения своих данных, которые должны быть более эффективными, чем база данных. Возможно, вы захотите взглянуть на NoSQL в Википедии , чтобы начать с

РЕДАКТИРОВАТЬ: Используете ли вы самые компактные типы данных для вашей базы данных? Являются ли ваши идентификаторы целыми числами минимально возможного размера для хранения диапазона идентификаторов? Если ваши строки ASCII, вы храните их как строки ASCII, а не Unicode (VARCHAR, а не NVARCHAR)?

...