Одна вещь, которая часто помогает, - это использование легкого пула памяти с небольшим объемом служебной информации. Если вы комбинируете это с «распределенными» методами выделения (игнорируя любое удаление / освобождение до тех пор, пока вы все не закончите с данными), вы можете получить что-то смехотворно быстрое.
Недавно мы сделали это для встраиваемой системы, в основном из соображений производительности, но она также сэкономила много памяти.
Хитрость заключалась в том, чтобы выделить большой блок - немного больше, чем нам нужно (вы могли бы выделить цепочку блоков, если хотите) - и просто возвращать «текущий» указатель (увеличивая его с помощью allocSize округляется до максимального значения выравнивания 4 в нашем случае, каждый раз). Это сократило наши накладные расходы на выделение ресурсов с порядка 52-60 байтов до <= 3 байтов. Мы также игнорировали «бесплатные» вызовы до тех пор, пока не закончили разбор, а затем не освободили весь блок. </p>
Если вы достаточно умны в распределении кадров, вы можете сэкономить много места и времени. Возможно, вам не удастся пройти весь путь до 15 ГБ, но стоило бы посмотреть, сколько места у вас действительно наверху ... Мой опыт работы с системами на основе DOM заключается в том, что они используют тонны небольших ресурсов, каждый из которых имеет относительно высокий накладные расходы.
(Если у вас есть виртуальная память, большой «блок» может даже не сильно повредить, если ваш доступ в любой момент времени является локальным для страницы или трех в любом случае ...)
Очевидно, что в долгосрочной перспективе вам нужно сохранить память, которая вам действительно нужна, но «чистая память» анализатора становится намного более эффективной.