Как сохранить объекты C в памяти в расширении Ruby между вызовами? - PullRequest
0 голосов
/ 05 ноября 2011

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

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

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

Индекс должен уметь делать две вещи:

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

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

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

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

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

1 Ответ

0 голосов
/ 05 ноября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...