在共享内存中保持固定大小的符号
Posted
技术标签:
【中文标题】在共享内存中保持固定大小的符号【英文标题】:Keeping fixed size symbols in shared memory 【发布时间】:2014-10-24 17:10:33 【问题描述】:我一直在做一些事情,需要我存储符号列表和相应的计数,这些被存储为字符串,int 映射。问题是输入大小约为 32 MB,但是当我尝试将其存储在内存中时,大小膨胀到 1.4Gb,我浏览了一些链接,发现 std::string 占用了大量内存用于簿记和可能会导致膨胀,所以我进一步看了看,发现可以使用大小等于符号最大大小的 boost::array 并且因为 boost 数组不做任何簿记,所以它没有'不会导致内存膨胀。
但是,我希望像 map<boost::array<char, 15>
, int> 那样将这个 boost 数组放在共享内存中。我查看了 boost::array 文档,发现它不支持分配器,目前我正在使用分配器和段来自 boost 的经理如下:
typedef bip::allocator<char, bip::managed_shared_memory::segment_manager> CharAllocator;
typedef bip::basic_string<char, std::char_traits<char>, CharAllocator> SharedString;
我也遇到了这个链接,它似乎解释了很多: http://jovislab.com/blog/?p=89
有没有办法做到这一点,我还有什么其他选择。我不是在寻找完整的解决方案,而是在寻找提示。 谢谢, 黛比!
【问题讨论】:
std::string
不天生就会将 32MB 的数据膨胀到 1.4GB !!!您在代码中做错了什么。
“我不是在寻找完整的解决方案,而是提示。” 这表明您并不是要向此问答库提交条目,而是在寻找真正的讨论板、论坛或聊天室。
如果你使用 std::allocator 会不会爆炸
@surt 我还没有使用 std:allocator 进行测试,请让我尝试一下并返回结果
【参考方案1】:
正确的提示是:
使用连续分配 提前预订此答案包含对不同分配技术与 Boost managed_shared_memory 的良好并排比较:
How do I measure the size of a boost interprocess vector in shared memory?在您的特定情况下,您可以使用扁平化分配
flat_map
和
对字符串使用池分配器(或者可能使用boost::string_ref
来引用从大std::vector<char>
分配的字符串)
【讨论】:
以上是关于在共享内存中保持固定大小的符号的主要内容,如果未能解决你的问题,请参考以下文章