
作為記憶體擴充包 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 程式碼的標記化。