【发布时间】:2012-02-25 04:49:19
【问题描述】:
我是 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 条以上的记录。
【问题讨论】:
-
你用的是什么编译器?
-
请用你的标题描述问题。实际上,在我们讨论它的同时,这是 五个 问题。像这样发布它们。
-
您的读者是否必须阅读相同的数据?所有进程的键数是否固定?
-
是的,所有读者都必须阅读相同的数据。但是有些可能会更快消耗,有些可能会因为阅读器对数据进行的某些操作而稍慢一些。 (这些操作因读者而异)
-
您的索引要求是什么?
标签: c++ ipc semaphore shared-memory copy-and-swap