Одной вещью, которая часто помогает, является использование легкого пула памяти с низкой памятью. Если вы комбинируете это с методами распределения «frame» (игнорируя любое удаление/освобождение, пока вы не закончите с данными), вы можете получить что-то нелепое быстро.
В последнее время мы сделали это для встроенной системы, главным образом по соображениям производительности, но это также сэкономило массу памяти.
Трюк состоял в основном в том, чтобы выделить большой блок - немного больше, чем нам нужно (вы могли бы выделить цепочку блоков, если хотите), - и просто продолжайте возвращать «текущий» указатель (наталкивая его на allocSize, округленное до максимального требования к выравниванию 4 в нашем случае, каждый раз). Это сократило наши накладные расходы на каждый распределитель от порядка 52-60 байт до < = 3 байта. Мы также игнорировали «бесплатные» вызовы, пока все не закончили синтаксический анализ, а затем освободили весь блок.
Если вы достаточно умны с распределением кадров, вы можете сэкономить много места и времени. Это может не довести вас до 15GiB, но стоило бы посмотреть, сколько у вас накладных расходов ... Мой опыт работы с DOM-системами заключается в том, что они используют тонны небольших распределений, каждый из которых имеет относительно высокий уровень накладные расходы.
(Если у вас есть виртуальная память, большой «блок» не может даже повредить, что многим, если ваш доступ в любой момент времени является локальным для страницы или три равно ...)
Очевидно, что вы должны сохраняйте необходимую вам память в долгосрочной перспективе, но «царапающая память» парсера становится намного более эффективной таким образом.
Какой парсер вы используете. MSXML? – Naveen
Это один 15GB XML-файл? Сколько места вам ожидают результирующие объекты? Вы импортируете все объекты или только выделение? Вы на 64-битной платформе? –
да Я на 64-битной платформе. Его единственный файл размером 15 ГБ. –