Я столкнулся с довольно странной вещью, связанной с хэш-картой stdext. Мне приходится работать со многими объектами, и приоритет - быстрый доступ к элементам.
Моя программа считывает значения объекта из файла и, если это новый элемент, затем вставляет это значение в hashmap, если это уже обработанный объект, то изменяет сохраненное значение в hashmap.
Моя проблема связана с hashmap(stdext)
. Я не нашел никакой опции инициализации для этого контейнера.
Ключевым элементом является целое число без знака (uint64
), и этот объект сохраняется в хэш-карте с этим ключом, размером 160 КБ.
Программа работает, но мне приходится слишком долго ждать, когда количество объектов в hashmap достигает предела.
После этого hashmap снова работает хорошо, как я и ожидал. Я подумал, может быть, это реорганизация шаг.
Но эти шаги очень важны, потому что после определенного количества объектов этот шаг занимает 5 часов, в то время как обычный шаг обработки составляет около 2-3 минут. После этого обработка становится «нормальной».
Кто-нибудь сталкивался с такими проблемами? Кто-нибудь знает что-то более глубокое об этой хэш-карте? Я не нашел ничего релевантного по этой теме.
Я пытаюсь использовать параметры hashmap со значениями не по умолчанию: bucket_size
и min_buckets
. Значения по умолчанию для этого bucket_size=4
и min_buckets=8
. Я изменил их в файле xhash на большие значения, потому что мне не удалось изменить эти значения из кода. Я думаю, что min_buckets
имеет решающее значение в моем приложении, я пытаюсь "настроить", чтобы получить лучшую производительность, избегая шага реорганизации.
Но у меня возникает другая проблема, все работает нормально, пока я не попытаюсь очистить hashmap. Это занимает много времени. Когда я использую его со значениями по умолчанию, работает очень быстро.
Был ли это плохой шаг для изменения файла xhash? Кто-нибудь использовал значения не по умолчанию раньше? Каковы причины этого медленного прояснения?
Мой второй вопрос связан с хранением указателей в hashmap. Идея ясна, но как мне удалось освободить остроконечную память. Я должен создать указатели на мои объекты; эти указатели хранятся в hashmap, и когда мне нужно значение, оно может разыменовать этот указатель. Но как я мог очистить память после того, как я сохранил карту? Может быть, это тривиальный вопрос, но сейчас я не вижу решения.
Спасибо за ваши уже опубликованные ответы.