Я работаю над тем, что требует от меня хранения списка символов и соответствующего количества, они хранятся в виде строки, int mapping. Проблема заключается в том, что размер ввода составляет около 32 МБ, но когда я пытаюсь сохранить его в памяти размером с разрывом до 1.4 ГБ, я просмотрел несколько ссылок и обнаружил, что std :: string занимает достаточное количество памяти для ведения бухгалтерского учета и вероятно, вызовет раздувание, поэтому я посмотрел немного дальше и обнаружил, что можно использовать массив boost :: с размером, равным максимальному размеру символа, и поскольку массив boost не делает никакой книги, t вызвать раздувание памяти. Тем не менее, я хочу разместить этот массив boost в общей памяти, например, так: map<boost::array<char, 15>
, int>. Я взглянул на документацию 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
Есть ли способ сделать это, каковы другие варианты, которые у меня есть. Я не ищу полные решения, но подсказки. Спасибо, Деб!
Правильные советы:
Этот ответ содержит хорошее параллельное сравнение различных методов распределения с Boost managed_shared_memory:
В вашем конкретном случае вы можете сгладить распределение, используя
flat_map
иboost::string_ref
для ссылки на строки, выделенные из большого std::vector<char>
)
std::string
сути не раздувает 32 МБ данных до 1,4 ГБ !!! Вы сделали что-то очень неправильное в своем коде.