
Как автору пакета pgfplots, интенсивно использующего память, мне было поручено проанализировать некоторые ситуации нехватки памяти.
Я смог определить «виновника»: это был какой-то вызов, \pdfmdfivesum
в результате которого он в конце концов рухнул.
Мне известны некоторые решения, как увеличить или обойти ограничения памяти, поэтому, пожалуйста, воздержитесь от предложений, как избежать этой проблемы.
Моя мотивация здесь такова: как инженер-программист, я хотел бы иметь своего рода "кучу дампов", в которой я мог бы проверить, сколько памяти в данный момент занято каким "словом" или чем-то еще. Это, как я надеюсь, позволит оптимизировать и систематически улучшать; т. е. очищать неиспользуемые регистры или реструктурировать макрорасширение или что-то еще.
Знаете ли вы, можно ли сгенерировать дампы кучи, понятные человеку?
Вот еще немного информации о проблеме, которую я пытался решить.
Лично я считаю, что этот раздел более или менее не связан с вопросом выше: мне бы очень хотелось услышать ответы, даже если существует простое решение данной проблемы.
В любом случае, если вы видите, как улучшить ситуацию, я бы внимательно вас выслушал.
Проблема заключалась в размере основной памяти. По-видимому, matlab2tikz
был сгенерирован файл размером 300k, содержащий самостоятельную фигуру pgfplots вместе с (множеством!) точек данных. И external
библиотека tikz попыталась загрузить этот файл в основную память, чтобы вычислить его хэш MD5. Это не удалось. Обратите внимание, что без вычисления MD5 файлмогбыть обработаны. Фактически, внешняя библиотека tikz использует \edef\pgfretval{\pdfmdfivesum{\meaning\tikzexternal@temp}}
и вызов \meaning
не удается, если \tikzexternal@temp
содержит эти 300 тыс. слов. Я предполагаю, что эти слова встречаются в основной памяти TeX не один раз; и я хотел бы узнать, где и почему. Именно здесь я надеялся увидеть дамп кучи.
Runaway definition?
->
! TeX capacity exceeded, sorry [main memory size=3000000].
\tikzexternal@hashfct ...aning \tikzexternal@temp
}
l.105 \end{tikzpicture}
%
If you really absolutely need more capacity,
you can ask a wizard to enlarge me.
Here is how much of TeX's memory you used:
18462 strings out of 494578
804304 string characters out of 3169744
3000001 words of memory out of 3000000
21352 multiletter control sequences out of 15000+200000
решение1
Основной движок TeX использует не динамически выделяемую память, а предварительно выделенные пулы памяти. Так что нет ничего лучше кучи, которую можно сбросить.
Базовый код TeX не предоставляет способа показать содержимое и указатели в предварительно выделенных пулах памяти. Поэтому ответ на ваш вопрос: нет, невозможно сгенерировать "полезный" дамп кучи TeX (который должен называться дампом пула памяти). С LuaTeX это может быть возможно, поскольку он использует не базовый код TeX, а переписанный движок.
Чтобы расширить память TeX, вы можете редактировать/настраивать файл конфигурации texmf.cnf
и повторно генерировать ваши форматы на tex -ini
этапах установки TeX. Вот почему здесь нужен мастер. Но в большинстве случаев лучше переосмыслить токенизацию вашего кода TeX.