Хранение символов фиксированного размера в общей памяти

0

Я работаю над тем, что требует от меня хранения списка символов и соответствующего количества, они хранятся в виде строки, 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

Есть ли способ сделать это, каковы другие варианты, которые у меня есть. Я не ищу полные решения, но подсказки. Спасибо, Деб!

  • 1
    std::string сути не раздувает 32 МБ данных до 1,4 ГБ !!! Вы сделали что-то очень неправильное в своем коде.
  • 1
    «Я не ищу полных решений, но намеки». Это говорит о том, что вы не имеете в виду подать запись в этот репозиторий вопросов и ответов, а вместо этого действительно ищете доску обсуждений, форум или чат.
Показать ещё 2 комментария
Теги:
arrays
boost
memory

1 ответ

1
Лучший ответ

Правильные советы:

  • использовать смежные распределения
  • запасаться вперед

Этот ответ содержит хорошее параллельное сравнение различных методов распределения с Boost managed_shared_memory:

В вашем конкретном случае вы можете сгладить распределение, используя

  • flat_map и
  • использовать распределитель пула для строк (или, возможно, использовать boost::string_ref для ссылки на строки, выделенные из большого std::vector<char>)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню