Ответ в значительной степени будет зависеть от того, нужно ли вам поддерживать данные, сравнимые с оперативной памятью вашей машины или превышающие ее, и от того, в вашем типичном случае использования вы, вероятно, получите доступ ко всем индексированным данным или, скорее, только к небольшой их части.
Если вы уверены, что ваши данные поместятся в памяти вашего компьютера, вы можете попытаться оптимизировать структуру на основе карты, которую вы используете сейчас. Хранение ваших данных на карте должно обеспечить довольно быстрый доступ, но всегда будут некоторые начальные накладные расходы, когда вы загружаете данные с диска в память. Кроме того, если вы используете только небольшую часть индекса, этот подход может быть довольно расточительным, поскольку вы всегда читаете и записываете весь индекс и сохраняете его в памяти.
Ниже я перечисляю некоторые предложения, которые вы могли бы попробовать, но прежде чем тратить слишком много времени на какое-либо из них, убедитесь, что вы действительно измеряете, что улучшает загрузку и время выполнения, а что нет. Без профилирования фактического рабочего кода на реальных данных, которые вы используете, это просто догадки, которые могут быть совершенно неверными.
map
реализован в виде дерева (обычно черно-красное дерево). Во многих случаях hash_map
может дать вам лучшую производительность, а также лучшее использование памяти (например, меньше выделений и меньше фрагментации).
- Попробуйте уменьшить размер данных — меньше данных означает, что их будет быстрее считывать с диска, потенциально будет меньше выделяемой памяти, а иногда и лучше производительность в памяти из-за лучшей локальности. Вы можете, например, считать, что вы используете
float
для хранения частоты, но, возможно, вы могли бы хранить только количество вхождений как unsigned short
в значениях карты, а в отдельной карте хранить количество всех слов для каждого документа (также как короткий ). Используя два числа, вы можете пересчитать частоту, но использовать меньше места на диске при сохранении данных на диск, что может привести к ускорению загрузки.
- Ваша карта имеет довольно много записей, и иногда использование настраиваемых распределителей памяти помогает повысить производительность в таком случае.
Если ваши данные потенциально могут выйти за пределы размера оперативной памяти вашего компьютера, я бы посоветовал вам использовать файлы с отображением памяти для хранения данных. Такой подход может потребовать перемоделирования ваших структур данных и либо использования настраиваемых распределителей STL, либо использования полностью настраиваемых структур данных вместо std::map
, но это может повысить вашу производительность на порядок, если все сделано правильно. В частности, этот подход освобождает вас от необходимости загружать всю структуру в память сразу, поэтому время запуска значительно улучшится за счет небольших задержек, связанных с доступом к диску, распределенным во времени, когда вы касаетесь разных частей структуры в первый раз. время. Тема довольно широкая и требует гораздо более глубоких изменений в вашем коде, чем просто настройка карты, но если вы планируете обрабатывать большие объемы данных, вам обязательно стоит взглянуть на mmap
и друзей.
person
Michał Kosmulski
schedule
23.03.2014