В 32-битной XP максимальное адресное пространство программы составляет 2 ГБ. Затем происходит фрагментация из-за загрузки DLL и драйверов в ваше адресное пространство. Наконец, у вас есть проблема фрагментации вашей кучи.
Ваш лучший шаг - просто покончить с этим и запустить как 64-битный процесс (в 64-битной системе). Внезапно все эти проблемы уходят. Вы можете использовать лучшую кучу для смягчения эффектов фрагментации кучи, и вы можете попробовать использовать VirtualAlloc, чтобы захватить вашу память в один большой непрерывный блок (и затем вы сможете управлять этим оттуда!), Чтобы отговорить DLL / драйверы от фрагментации.
Наконец, вы можете разделить ваш BSP по процессам. Сложно и мучительно, и, честно говоря, просто поместить его на диск было бы проще, но теоретически вы могли бы получить более высокую производительность, если бы группа процессов обменивалась информацией, если бы вы могли сохранять все резидентным (и при условии, что вы можете быть умнее, чем память, чем ОС может обрабатывать буферизацию файлов ... что является большим, если). Каждому процессу потребовалось бы гораздо меньше памяти и, следовательно, он не должен работать до предела адресного пространства 2 ГБ. Конечно, вы будете прожигать RAM / swap намного быстрее.
Вы можете смягчить эффекты фрагментации адресного пространства, выделив меньшие фрагменты. Это будет иметь другие неприятные побочные эффекты, но вы могли бы следовать политике отсрочки, когда вы захватываете все меньшие и меньшие куски памяти, если вам не удастся успешно выделить. Часто этот простой подход дает вам программу, которая работает, когда она не работает, но в остальное время работает так же хорошо, как и могла.
Мальчик, разве 64-битные вычисления не звучат намного лучше, чем другие варианты?