作为内存密集型软件包 pgfplots 的作者,我被要求分析一些内存不足的情况。
\pdfmdfivesum
我可以识别出“罪魁祸首”;这是导致它最终崩溃的某个调用。
我知道一些如何扩大或避免内存限制的解决方案,所以请避免提出如何避免该问题的建议。
我在这里的动机是:作为一名软件工程师,我希望有某种“堆转储”,在其中我可以检查哪个“字”或其他东西当前占用了多少内存。这有望实现优化和系统改进;即通过清除未使用的寄存器或通过重组宏扩展或其他方式。
您是否知道是否可以生成人类可读的堆转储?
以下是我尝试解决的问题的一些更多见解。
就我个人而言,我认为这部分与上述问题基本无关:即使手头的问题有一个简单的解决方案,我也很想听到答案。
无论如何,如果您知道如何改善这种情况,我会仔细听取。
手头的问题是主内存大小。显然,matlab2tikz
生成了一个 300k 文件,其中包含一个独立的 pgfplots 图以及(大量!)数据点。并且 tikzexternal
库尝试将该文件加载到主内存中以计算其 MD5 哈希值。这失败了。请注意,如果没有 MD5 计算,文件可以被处理。事实上,tikz 外部库使用,如果包含这 300k 个单词\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 代码的标记化。