TeX 可以產生「堆轉儲」來分析+優化記憶體不足的情況嗎?

TeX 可以產生「堆轉儲」來分析+優化記憶體不足的情況嗎?

作為記憶體擴充包 pgfplots 的包作者,我被要求分析一些記憶體不足的情況。

我可以找出「罪魁禍首」;這是\pdfmdfivesum它最終崩潰的一些呼叫。

我知道一些如何擴大或避免記憶體限制的解決方案,因此請避免提出如何避免該問題的建議。

我的動機是:作為一名軟體工程師,我希望有某種“堆轉儲”,我可以在其中檢查當前哪個“單字”或其他什麼佔用了多少記憶體。這有望實現優化和系統改進;即透過清除未使用的暫存器或透過重組巨集擴充或其他方式。

您知道是否可以產生人類可讀的堆轉儲嗎?


以下是我試圖解決的問題的更多見解。

就我個人而言,我認為這一部分或多或少與上面的問題無關:即使手頭上的問題有一個簡單的解決方案,我也真的很想聽到答案。

不管怎樣,如果你看到如何改善這種情況,我會仔細聆聽。

目前的問題是主記憶體大小。顯然,matlab2tikz產生了一個 300k 的文件,其中包含一個獨立的 pgfplots 圖形以及(很多!)數據點。 tikzexternal庫嘗試將該檔案載入到主記憶體中以計算其 MD5 雜湊值。這失敗了。請注意,如果沒有 MD5 計算,文件可以被處理。事實上,tikz 外部函式庫使用\edef\pgfretval{\pdfmdfivesum{\meaning\tikzexternal@temp}}並且呼叫\meaning失敗 if\tikzexternal@temp包含這 300k 個字。我想這些字在 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 內存,您可以編輯/自訂設定檔並在TeX 安裝步驟texmf.cnf中重新產生格式。tex -ini這就是為什麼這裡需要一個嚮導。但大多時候最好重新考慮 TeX 程式碼的標記化。

相關內容