Что я должен сделать для размещения крупномасштабного хранения и извлечения данных? - PullRequest
0 голосов
/ 30 декабря 2010

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

34 "doc1, doc2, doc45"

Количество отпечатков пальцев очень велико (может достигать триллионов).В базе данных в основном выполняются следующие операции: вставка / обновление записи и извлечение записи в соответствии с совпадением по отпечатку пальца.Фрагмент определения таблицы Python:

self.cursor.execute("CREATE TABLE IF NOT EXISTS `fingerprint` (fp BIGINT, documents TEXT)")

А фрагмент операции вставки / обновления:

if self.cursor.execute("UPDATE `fingerprint` SET documents=CONCAT(documents,%s) WHERE fp=%s",(","+newDocId, thisFP))== 0L:
                self.cursor.execute("INSERT INTO `fingerprint` VALUES (%s, %s)", (thisFP,newDocId))         

Единственное узкое место, которое я наблюдал до сих пор, - это время запроса в MySQL.Все мое приложение основано на веб-технологиях.Так что время является критическим фактором.Я также думал об использовании кассандры, но знаю об этом меньше.Пожалуйста, предложите мне лучший способ решения этой проблемы.

Ответы [ 3 ]

2 голосов
/ 30 декабря 2010

Получить базу данных высокого класса. У Oracle есть несколько предложений. SQL Server также.

Триллион записей выходит за рамки обычной базы данных. Это очень высококачественный, очень особенный материал, особенно если вы хотите достойного исполнения. Также получите для него аппаратное обеспечение - это означает приличный сервер среднего уровня, 128 + ГБ памяти для кэширования и либо приличный SAN, либо достаточно хорошую настройку DAS через SAS.

Помните, TRILLIONS означает:

  • 1000 ГБ используется для КАЖДОГО БАЙТА.

Если отпечаток пальца хранится как int64, это только 8000 ГБ дискового пространства для этих данных.

Или вы пытаетесь запустить его с небольшого дешевого сервера с парой дисков по 2 ТБ? Удачи.

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

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

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

SADD fingerprint, docid

для добавления или обновления записи и

SMEMBERS fingerprint

для получения всех идентификаторов документов с этим отпечатком.

SADD - O (1).SMEMBERS - это O (n), но n - это количество документов в наборе, а не количество документов / отпечатков пальцев в системе, поэтому в данном случае это также O (1).

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

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

Хранилище данных Greenplum , FOC, postgres, удачи ...

...