Ищете сверхбыстрое хранилище данных для выполнения операций пересечения - PullRequest
4 голосов
/ 27 февраля 2012

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

Я проводил следующий тест:

- x , y и z - наборы Redis, все они содержат ок.1 миллион членов (случайные целые числа, взятые из начального массива, содержащего 3M + членов).

- я хочу пересечь xy и z , поэтому я использую sintersectstore (чтобы избежать перегрева, вызванного извлечением данных с сервера на клиент)

sinterstore r x y z

- результирующий набор ( r ) содержит около полумиллиона членов, Redisвычисляет этот набор примерно за полсекунды.

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

У меня естьЯ не проверял, как Redis будет реагировать на такие огромные наборы, но я предполагаю, что обработка данных займет гораздо больше времени.

Я правильно это делаю?Есть ли более быстрый способ сделать это?

Примечания:

- собственные массивы не вариант, так как я ищу распределенное хранилище данных, к которому могут обращаться несколько работников.

- Я получаю эти результаты на 8-ядерном компьютере Mac с тактовой частотой 3,4 ГГц и 16 ГБ ОЗУ, в конфигурации Redis отключено сохранение диска.

1 Ответ

4 голосов
/ 01 марта 2012

Я подозреваю, что растровые изображения - ваша лучшая надежда.

По моему опыту, redis - идеальный сервер для растровых изображений;вы бы использовали структуру данных string (одна из пяти структур данных, доступных в redis)

доступны многие или, возможно, все необходимые вам операцииготовое к использованию в Redis, как атомарные операции

RedIS setbit операция имеет временную сложность O (1)

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

>>> r1.setbit('k1', 20, 1)

первый аргумент - это ключ, второй - смещение (значение индекса), а третий - значение по этому индексу на растровом изображении.

, чтобы найтибит установлен в этом смещении (20), вызов getbit , передавая ключ для битовой строки.

>>> r1.getbit('k1', 20)

затем на этих растровых изображениях вы, конечно, можете выполнять обычные побитовые операции, например, логические И, ИЛИ, XOR.

...