Есть ответы, но трудно быть общим, не зная подробностей проблемы.
Я предполагаю 32-разрядную Windows XP.
Попытайтесь избежать необходимости в 100 МБ непрерывной памяти, если вам не повезло, несколько случайных DLL будут загружаться в неудобных точках через ваше доступное адресное пространство, быстро сокращая очень большие области непрерывной памяти. В зависимости от того, какие API-интерфейсы вам нужны, это может быть довольно сложно предотвратить. Может быть довольно удивительно, как просто выделение нескольких блоков памяти размером 400 МБ в дополнение к некоторому «нормальному» использованию памяти может оставить вам нигде, чтобы выделить финальный «маленький» блок размером 40 МБ.
С другой стороны, предварительно распределите разумные размеры кусков за раз. Из порядка 10 МБ или около того это хороший компромиссный размер блока. Если вам удастся разбить ваши данные на такие куски размера, вы сможете достаточно эффективно заполнить адресное пространство.
Если вы все еще собираетесь исчерпать адресное пространство, вам нужно будет иметь возможность блокировать страницы и использовать их на основе какого-то алгоритма кеширования. Выбор правильных блоков для выхода страницы будет зависеть от вашей обработки algortihm и будет нуждаться в тщательном анализе.
Выбор места, где можно перечислить вещи, это другое решение. Вы можете просто записать их во временные файлы. Вы также можете исследовать API-интерфейс Microsoft Office Window Extenstions. В любом случае вам нужно быть осторожным в своем дизайне приложений, чтобы очистить любые указатели, указывающие на то, что должно быть выгружено, иначе действительно будут плохие вещи (tm).
Удачи!
Я думаю, вы, вероятно, хотите избежать фрагментации, а не дефрагментации? – 2008-09-29 21:26:27
Моя ставка на C++ - но это правда: на вопрос нельзя ответить, если базовая «парадигма» неизвестна .... – Georgi 2008-09-29 21:27:59
Спасибо, Дуглас, я исправил это! – 2008-09-29 21:28:07