Это старый вопрос, но, поскольку я недавно сделал то же самое ...
Простого ответа нет. В идеальном мире вы бы использовали машину с огромным адресным пространством (т.е. 64-битным) и огромным объемом физической памяти. Одного огромного адресного пространства недостаточно, или оно будет просто повреждено. В этом случае проанализируйте файл XML в базе данных и, используя соответствующие запросы, извлеките то, что вам нужно. Вполне вероятно, что именно это делает сама OSM (я думаю, что мир составляет около 330 ГБ).
На самом деле я все еще использую XP 32bit из соображений целесообразности.
Это компромисс между пространством и скоростью. Вы можете делать что угодно в любом объеме памяти, если вам все равно, сколько времени это займет. Используя структуры STL, вы можете анализировать все, что захотите, но скоро вам не хватит памяти. Вы можете определить свои собственные распределители, которые меняются местами, но опять же, это будет неэффективно, потому что карты, векторы, наборы и т. Д. Действительно не знают, что вы делаете.
Единственный способ, с помощью которого я нашел все это на небольшом месте на 32-битной машине, - это очень тщательно подумать о том, что я делаю, и о том, что нужно сделать, и разбить задачу на куски. Эффективное использование памяти (никогда не использует более ~ 100 МБ), но не очень быстро, но тогда это не имеет значения - как часто нужно анализировать данные XML?