Я новичок в IPC. Процесс записи записывает данные в разделяемую память, многие процессы чтения считывают данные. Записываемые данные имеют уникальный идентификатор, должны быть проиндексированы уникальным ключом для более быстрого доступа (например, STL::map или hashmap для поиска). Также данные представляют собой запись переменной длины (XML) (средняя длина 200-250 байт). ОС Solaris 10 (i86pc) на четырехъядерном сервере Intel Xeon.
Общий размер данных составляет более 200G. Но мы будем хранить в общей памяти только последние данные. Исторические данные находятся в файле. размер общей памяти будет около 4G~6G.
Нет доступной внешней библиотеки, такой как Boost::interprocess
У меня есть пара вопросов, может быть много
- Что эффективнее: shared_memory или mmap (файлы с отображением памяти)
- Как построить индексы для записи переменной длины. [Понятия не имею, может быть какое-то хеширование?].
- Будет ли это аккуратно, если XML будет преобразован в структуру фиксированного размера (компромисс - размер структуры будет огромным, почти 300+ возможных полей)
- Можем ли мы поместить любой STL в общую_память, предоставив пользовательский распределитель?
- Возможна ли реализация без семафоров (безблокировочная реализация с использованием CAS).
Спасибо
Как насчет этого.
|--------------------------|
| start_id | end_id | -> range of msg id present in the segment
|--------------------------|
| id1 | start_mem | length | ->
|--------------------------| ->
| id2 | start_mem | length | -> table of index for the actual data
|--------------------------| ->
| id3 | start_mem | length | ->
|--------------------------| ->
| id4 | start_mem | length | ->
|--------------------------| ->
| |
| |
| |
| data segment |
| varibale length |
| xml are stored |
| |
| |
|--------------------------|
При поступлении новых данных и заполнении сегмента. самые старые данные стираются по кругу. Может быть возможность стереть более 1 записи.