我是 IPC 的新手。Writer进程将数据写入共享内存,许多Reader进程读取数据。要写入的数据具有唯一标识符,必须通过唯一键索引以便更快地访问(例如 STL::map 或 hashmap 用于查找)。数据也是可变长度记录( XML )(平均长度为 200-250 字节)。操作系统是 Intel Xeon 四核服务器上的 solaris 10 (i86pc)。
总数据量超过200G。但我们将只在共享内存中保留最新数据。历史数据驻留在文件中。共享内存大小约为 4G~6G。
没有像 Boost::interprocess 这样的外部库可用
我有几个问题,可能很多
- 哪个更有效:shared_memory 或 mmap(内存映射文件)
- 如何为可变长度记录建立索引。[我不知道,可能是一些散列?]。
- 如果将 XML 转换为固定大小的结构,这会不会很整洁(权衡结构的大小将是巨大的,近 300 多个可能的字段)
- 我们可以通过提供自定义分配器将任何 STL 放在 shared_memory 中吗?
- 是否可以在没有信号量的情况下实现(使用 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 条以上的记录。