snyders: (Default)
[personal profile] snyders
Имеется CGI скрипт написаный на C, который зачитывает в память некую базу данных, после чего отвечает на queries юзера, делая поиск по базе.

Проблема: база достаточно большая и приходится зачитывать ее в память при каждом query, что занимает 10-20 секунд.

Вопрос: можно ли как-то хранить базу в памяти между сессиями? (Кажется можно попробовать запускать процесс, читающий базу, отдельно и держать его в памяти. Но это решение будет привязано к конкретной ОС и нет ли чего-нибудь по-проще? Перегонять всю базу к клиенту не подходит.)

Date: 2005-10-26 09:28 am (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner
Решение может быть не слишком зависимым от конкретной ОС. Если процесс, обрабатывающий http-запрос будет обращаться к процессу, хранящему базу через TCP/IP-сокет, то решение будет работоспособно практически везде, где может быть запущен web-сервер. Могут быть, правда, проблемы не с ОС, а с настройками конкретного хостингового сервера - на многих хостинговых серверах не разрешают запускать долгоживущие процессы.

С другой стороны, на многих web-хостингах предоставляются "стандартные" долгоживущие процессы, SQL-сервера называются (обычно mySQL или MS-SQL). Так что если переписать это дело под использование SQL-базы (тут, правда, головой подумать придется), требуемый эффект будет достигнут.


Наиболее разумным вариантом кажется отказаться от ЗАЧИТЫВАНИЯ базы в память, и хранить её на диске в виде, облегчающем быстрый поиск. Варианты здесь следующие:

1. Храним базу в файле примерно в том виде, в каком она получается в памяти после зачитывания, только вместо указателей используем смещения от начала файла. При запуске скрипта делаем mmap (или его аналог в Win32) и отображаем файл в адресное пространство процесса. Формат базы получается системно зависимый, т.е. программу зачитывания базы из нынешнего формата и сохранения в этот всё равно нужно иметь. Зато не нужно переделывать алгоритмы поиска. Единственное что придется перед всеми обращениями по указателю прибавлять смещение, хранящееся в соответствующей структуре к указателю на начало отображенного файла.

2. Используем persistent hash (dbm, Berkeley DB и вариации) или B-деревья (Berkeley DB)

3. Используем in-process SQL (http://www.sqlite.org). Зто сравнимо по трудозатратам с переходом на использование SQL-сервера, но зато мы не связаны с необходимостью искать хостинг с поддерживаемым диалектом SQL - свой диалект SQL мы с собой таскаем.

Date: 2005-10-26 07:25 pm (UTC)
From: [identity profile] snyders.livejournal.com
большое спасибо за подробный ответ!

Profile

snyders: (Default)
snyders

December 2025

S M T W T F S
 123456
78910111213
14151617181920
21222324252627
282930 31   

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 13th, 2026 04:24 pm
Powered by Dreamwidth Studios