Может ли TeX генерировать «дампы кучи» для анализа и оптимизации ситуаций нехватки памяти?

Может ли TeX генерировать «дампы кучи» для анализа и оптимизации ситуаций нехватки памяти?

Как автору пакета 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.

Связанный контент