Как сохранить объекты C в памяти в расширении Ruby между вызовами?

#c #ruby #memory #indexing

#c #ruby #память #индексирование

Вопрос:

Я разрабатываю веб-приложение в Rails, которое должно выполнять поиск и обработку данных с высокой вычислительной нагрузкой при ответе на запрос.

Я написал расширение ruby C, которое выполняет это вычисление, но чтобы ускорить процесс еще больше, мне нужно создать индекс.

Чтобы сохранить индекс быстро, я хочу просто использовать хэш-таблицу в C в памяти. Эта хэш-таблица будет большой. Порядка .5 — 1 ГБ памяти. Я думал об использовании базы данных, но мне нужен очень специфический формат для этого индекса, и в конечном итоге хэш-таблица довольно проста и будет очень быстрой.

Индекс должен быть способен выполнять две вещи:

1) отвечать на запросы поиска 2) отвечать на запросы о добавлении элементов в индекс без перезапуска программы

Я бы предпочел не писать полный сервер на C для создания этого индекса и управления им.

Есть ли способ, которым я могу написать расширение ruby C с помощью двух вышеупомянутых методов, которое сохраняет индекс в памяти между вызовами расширения?

Есть ли другой способ достичь того, что мне нужно выше, не записывая полный сервер на C?

В худшем случае я могу написать сервер C, с которым может взаимодействовать мое приложение rails, но я надеялся найти что-нибудь попроще.

Комментарии:

1. Является ли хэш-таблица большой из-за количества записей или размера записей?

2. Большой, потому что количество записей — не размер. Я создаю индекс sizeof (UInt32) , но он будет малонаселенным, поэтому я могу использовать 1/8 хэш-индексов, может быть, даже меньше..

Ответ №1:

Я думаю, что хэширование решалось много раз. Некоторые варианты MemcacheD или Redis. Запуск его на localhost должен сделать его очень быстрым и постоянным (по отношению к вашему приложению). В Redis также есть опции для резервного копирования вашего кэша на диск каждые N обновлений или N минут, если вы действительно хотите его сохранить.

Я бы проделал тяжелую работу на C, чтобы вычислить указанную дорогостоящую вещь. Затем вставьте его в Memcache / Redis, когда я верну его в Ruby.

Если вам нужно поместить это в Memcache / Redis, находясь на C, я полагаю, что оба написаны на C, поэтому использование библиотек не должно быть слишком сложным.

Комментарии:

1. Мне нужно выполнить тысячи поисковых запросов на запрос в этом индексе, поэтому использование Redis или Memcache все равно будет слишком медленным — мне действительно нужна хеш-таблица в памяти.

2. Сейчас я думаю просто изменить расширение C, чтобы создать класс Ruby с указателем C на хэш-таблицу в памяти .. и функции C, которые выполняют все необходимые вычисления.

3. Memcache и Redis находятся в памяти. Если вам нужно выполнить тысячи поисковых запросов на запрос, вам, вероятно, также потребуется иметь синхронный хэш, чтобы иметь возможность масштабироваться для обслуживания любого объема трафика. Каждый хост со своим собственным кэшем будет менее полезным. Но это проблема со стороны системного администратора.