Разработка 32-разрядного приложения C++/carbon под OS X Snow Leopard, столкнулось с проблемой, когда вектор stl содержит около 20 000 мелких объектов (по 72 байта каждый) не удалось во время перераспределения. Кажется, что вектор размером в несколько мегабайт не мог расширяться до смежной части памяти, которая в момент отказа составляла всего 1,2 МБ.Вектор 20 000 малых объектов против вектора 20 000 указателей объектов до 20 000 объектов кучи
GuardMalloc[Appname-33692]: *** mmap(size=2097152) failed (error code=12)
*** error: can't allocate region
GuardMalloc[Appname-35026]: Failed to VM allocate 894752 bytes
GuardMalloc[ Appname-35026]: Explicitly trapping into debugger!!!
#0 0x00a30da8 in GMmalloc_zone_malloc_internal
#1 0x00a31710 in GMmalloc
#2 0x94a54617 in operator new
#3 0x0026f1d3 in __gnu_cxx::new_allocator<DataRecord>::allocate at new_allocator.h:88
#4 0x0026f1f8 in std::_Vector_base<DataRecord, std::allocator<DataRecord> >::_M_allocate at stl_vector.h:117
#5 0x0026f373 in std::vector<DataRecord, std::allocator<DataRecord> >::_M_insert_aux at vector.tcc:275
#6 0x0026f5a6 in std::vector<DataRecord, std::allocator<DataRecord> >::push_back at stl_vector.h:610
Я могу назвать несколько стратегий:
1) Резерв() действительно, действительно большой вектор, как только запуски приложений. Однако это предполагает, что пользователь может не загружать дополнительные файлы, которые способствуют этому вектору, выталкивая его за пределы заранее выделенного предела и, возможно, возвращаясь к той же ситуации.
2) Измените вектор объектов/распределений памяти в вектор указателей на объекты/распределения памяти. Ясно, что сам вектор является более управляемым размером, но затем создает 20 000 небольших объектов (которые в конечном итоге могут стать похожими на 50 000 объектов, в зависимости от того, какие дополнительные файлы загружаются пользователем). Означает ли это гигантскую проблему с накладными расходами?
3) Переход от вектора к списку, который может иметь свои собственные служебные проблемы.
Вектор постоянно повторяется и, как правило, только прилагается.
Любые мыслители мудрецов по этим вопросам?
===============
ДОПОЛНИТЕЛЬНОГО ПРИМЕЧАНИЕ: этот конкретный вектор только держит все импортируемые записи, так что они могут быть индексированы и отсортированы по другому вектору, который содержит порядок сортировки , Как только элемент помещается в этот вектор, он остается там на время жизни приложения (также помогает поддерживать операции отмены, убедившись, что индекс в вектор всегда остается неизменным для этого конкретного объекта).
Любой шанс сделать это 64-разрядным приложением - Углерод обесценился, поэтому вам нужно будет изменить его в разумные короткие сроки. – Mark
@Mark: вы имеете в виду «устаревшие»? Я полагаю, что углерод тоже обесценивается. – outis
вы можете разделить вектор на многие векторы? 'vector *> VoV [100];' fill' Vov [0] ', а' push_back' терпит неудачу. начните заполнять 'VoV [1]'. и так далее. это подходит? или это слишком большая работа для обработки данных в нескольких структурах (сортировка, поиск, ...). кстати, вы можете создать свою собственную функцию, делая это ... im too optimistic –