У меня есть приложение, которое использует boost::interprocess::map
в общей памяти. Карта содержит большое количество элементов (от 100 к до 10 М), и все работает очень хорошо, за одним исключением: необходимо периодически очищать карту, и это, по-видимому, занимает около 4 мкс на элемент (что в худшем случае 40 секунд), что неприемлемо для приложения. Похоже, что clear()
фактически удаляет каждый элемент карты отдельно и ребалансирует дерево после каждого удаления, поэтому он ужасно неэффективен, когда у вас есть большое количество элементов. В идеале clear()
просто удалил бы все элементы без каких-либо перебалансировок - можно ли каким-либо образом реализовать такой оптимизированный метод clear()
?Более быстрый способ очистки boost :: interprocess :: map?
(Кстати, я также пытался boost:interprocess:flat_map
- это имеет гораздо быстрее, очевидно, время, как можно было бы ожидать (в 10 раз быстрее), но это слишком медленно для вставки/удаления.)
Примечание: earlier question on StackOverflow прикоснулся по аналогичной проблеме с меньшими STL-картами в нормальной (то есть не разделенной) памяти, но на самом деле не решила проблему.
Можете ли вы просто создать новую пустую карту, а затем удалить старый в нисходящем потоке с низким приоритетом или что-то еще? Или это слишком большая боль при координации общей памяти? – ipmcc
@ipmcc: спасибо, да, я планирую экспериментировать с этим, но, как вы заметили, это испортит мою архитектуру общей памяти, если адрес карты может периодически меняться. Кроме того, у меня есть ужасное подозрение, что удаление будет столь же неэффективным, что все элементы карты будут удаляться отдельно, но мне нужно это проверить. –
@PaulR Адрес карты не нужно менять: просто «свопите» свои карты.Затем вы можете переместить полную карту в поток с низким приоритетом, как предположил ipmcc. – syam