TeX はメモリ不足の状況を分析および最適化するために「ヒープ ダンプ」を生成できますか?

TeX はメモリ不足の状況を分析および最適化するために「ヒープ ダンプ」を生成できますか?

メモリを大量に消費するパッケージ pgfplots のパッケージ作成者として、メモリ不足の状況を分析するよう依頼されました。

私は「犯人」を特定できました。それ\pdfmdfivesumは最終的にクラッシュした何らかの呼び出しでした。

メモリ制限を拡張または回避するいくつかの解決策はわかっていますので、問題を回避する方法に関する提案は避けてください。

ここでの私の動機は、ソフトウェア エンジニアとして、現在どの「ワード」などがどのくらいのメモリを占有しているかを調べることができる、ある種の「ヒープ ダンプ」が欲しいと思ったことです。これにより、未使用のレジスタをクリアしたり、マクロ拡張を再構築したりすることで、最適化と体系的な改善が可能になることを期待しています。

人間が読めるヒープダンプを生成できるかどうかご存知ですか?


ここで、私が解決しようとした問題についてのさらなる洞察を示します。

個人的には、このセクションは上記の質問とはほとんど関係がないと思います。目の前の問題に簡単な解決策があったとしても、ぜひ答えを聞きたいです。

いずれにせよ、状況を改善する方法がわかれば、注意深く耳を傾けます。

問題はメインメモリのサイズでした。どうやら、matlab2tikz自己完結型のpgfplots図と(たくさんの!)データポイントを含む300kのファイルを生成しました。そして、tikzexternalライブラリは、そのファイルをメインメモリにロードしてMD5ハッシュを計算しようとしました。これは失敗しました。MD5計算なしでは、ファイルはできた処理されます。実際、tikz 外部ライブラリは を使用し、 にこれらの 30 万語が含まれている場合、\edef\pgfretval{\pdfmdfivesum{\meaning\tikzexternal@temp}}の呼び出しは失敗します。これらの語は TeX のメイン メモリに複数回出現すると思われます。その場所と理由を知りたいです。ここがヒープ ダンプが見たいと思った場所です。\meaning\tikzexternal@temp

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 インストールの手順でフォーマットを再生成しますtex -ini。そのためにウィザードが必要になります。ただし、ほとんどの場合、TeX コードのトークン化を再検討する方がよいでしょう。

関連情報