Структура на диске для хранения большого набора 128-битных целых чисел? - PullRequest
5 голосов
/ 18 ноября 2010

У меня около 500 миллионов 128-битных целых, прибавляя около 100 миллионов в год.Ничто не удаляется.Числа имеют равномерное распределение по шкале и по времени.

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

До сих пор мы использовали несколько таблиц MyISAM в MySQL, используядва bigints в качестве первичного ключа.Это дает нам нормальную производительность, но я подозреваю, что это не правильный инструмент для этой работы.У нас были некоторые проблемы с производительностью до разделения таблиц, и у нас были повреждения при отключении электроэнергии.Кроме того, БД дает нам гораздо больше возможностей, которые нам не нужны.

Я использую Python в Linux, но я открыт для предложений.

Подобный вопрос в C ++.

ОБНОВЛЕНИЕ: в комментарии Марсело упоминается Фильтр Блума , что мне кажется действительно многообещающим.Поскольку я работаю с хэшами, я уже отказался от полной точности, так что это может быть большой компромисс между точностью и производительностью.

Ответы [ 2 ]

3 голосов
/ 18 ноября 2010

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

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

РЕДАКТИРОВАТЬ: я сделал некоторые испытания. Я вставил 25 миллионов записей примерно за два часа, но он сожрал более 1 ГБ в процессе. Это делается путем генерации случайных чисел и распределения их по 32 подпроцессам, каждый с одной базой данных SQLite под своим контролем и фиксирует один раз каждые 100 000 вставок. В настоящее время вставки работают с частотой 1350 Гц, что намного превышает 3 Гц, которые требуются для вашей проблемы, но вся база данных по-прежнему помещается в кэш (у меня 8 ГБ ОЗУ). Я не буду знать производительность в стационарном режиме, если я не приблизюсь к вашему текущему размеру базы данных В этот момент каждая вставка будет вызывать как минимум четыре движения головки диска (чтение и запись индекса и таблицы, возможно, больше, чтобы углубиться в дерево B +), и тогда вы будете знать, сколько боли вы действительно переживаете .

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

0 голосов
/ 18 ноября 2010

Хэш хэши?

...