2014-10-24 3 views
0

Я работаю над тем, что требует от меня хранения списка символов и соответствующего счета, они сохраняются как строка, int mapping. Проблема заключается в том, что размер ввода составляет около 32 МБ, но когда я пытаюсь сохранить его в памяти размером с разрывом до 1.4 ГБ, я просмотрел несколько ссылок и обнаружил, что std :: string занимает достаточное количество памяти для ведения бухгалтерского учета и вероятно, вызовет раздувание, поэтому я посмотрел немного дальше и обнаружил, что можно использовать массив boost :: с размером, равным максимальному размеру символа, и поскольку массив boost не делает никакой книги, t вызвать раздувание памяти. Тем не менее, я хочу разместить этот массив boost в общей памяти так: map<boost::array<char, 15>, int>. Я взглянул на документацию boost :: array и обнаружил, что он не поддерживает распределители, в настоящее время я использую распределители и менеджеры сегментов от повышения следующим образом:Сохранение символов фиксированного размера в общей памяти

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' does _not_ неотъемлемо раздувает 32 МБ данных до 1,4 ГБ !!! Вы сделали что-то очень плохое в своем коде. –

+1

_ «Я не ищу полные решения, но подсказки». _ Это говорит о том, что вы не хотите вводить запись в этот репозиторий вопросов и ответов, но вместо этого ищите дискуссионный форум, форум или чат. –

+0

Взорвется ли это, если вы используете std :: allocator – Surt

ответ

1

Собственные подсказки:

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

Этот ответ содержит хороший бок о боке сравнения различных методов распределения с усилением managed_shared_memory:

В вашем конкретном случае, вы могли бы сгладить выделение с помощью

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