Вспомнил, зачем я вообще GlobalAlloc() использовал вместо стандартного GetMem(). Это был 32-битный сервис для Винды, который работает круглосуточно месяцами. Стандартных 2Гб на процесс хватало на месяц работы (или 2-3 дня на предельной нагрузке), потом начинались проблемы с фрагментацией памяти. Поэтому вместо стандартного TMemoryStream использовался свой аналог, на базе GlobalAlloc(), который мог использовать память за пределами доступных приложению 2Гб. Потом для больших блоков стал использовать файлы с атрибутом "временный" (хранится в памяти и автоматом свопится на диск если памяти не хватает), самый оптимальный вариант.
fastmm в помощь. с ним фрагментация сильно меньше. а с пятым, пишут, и еще меньше. вообще, то я временные большие куски файлами поделал (TFileStream против TMemoryStream), стало сразу сильно легче при почти минимальной просадке скорости - кэширование видимо спасает