記憶力の向上

記憶力の向上

私は約 4000 ページを生成するドキュメントに取り組んでおり、各ページには少なくとも 30 個のグラフィックが含まれています。フォントの切り替えや、異なる文字を異なる色で着色することが多々あります。出力されるページを制限できるため、コンパイルを正常に行うことができます。私は MikTex 64 ビットを使用していますが、texLive で試したときに同じ問題に気付きました。

しかし、ページ数を一定数以上に増やそうとすると、LuaLaTex は次のように終了してしまいます。

! TeX capacity exceeded, sorry [number of strings=493869].
<argument> ...ter {\reserved@b Pianos/256px/F/Piano_482.png} 
                                                  \ifeof \@inputcheck \else ...

l.33572 ...m]{{Pianos/256px/F/Piano_482.png}}F ♮3}
                                                   & \textcolor{F-Lt}{F} &  ...

 47374 words of node memory still in use:
   972 hlist, 276 vlist, 615 rule, 1 adjust, 7 disc, 276 local_par, 7 dir, 4 ma
th, 1376 glue, 30 kern, 388 penalty, 96 unset, 596 glyph, 16 align_record, 3318
 attribute, 142 glue_spec, 1660 attribute_list, 14 temp, 1 align_stack, 4 if_st
ack, 1 pdf_dest, 3 pdf_action, 412 pdf_colorstack, 26 pdf_setmatrix, 26 pdf_sav
e, 26 pdf_restore nodes
   avail lists: 1:1,2:32136,3:1080,4:450,5:513,6:468,7:9915,8:39,9:4238,10:45,1
1:507
!  ==> Fatal error occurred, no output PDF file produced!
SyncTeX written on document.synctex.gz.
Transcript written on document.log.

lualatex不具合は主に画像を何千回も含めることから発生すると思われるため、MWE を投稿することはできません。にコマンド ライン オプションを渡そうとしています-extra-mem-top=50000000

textmf ファイルも編集してみましたが、実際にはそのマジックナンバー (493869) の文字列数は変更されていないようです。メモリ割り当てに役立つ可能性があると読んだので、64 ビット バージョンのバイナリも実行していますが、実際には何も変わりませんでした。

答え1

LuaTeX はメイン メモリに動的メモリ割り当てを使用するため、 texmf.cnfpdftex ではなく luatex に設定しても、使用している設定は効果がありません。

ただし、文字列の数など、いくつかの固定配列の使用法は、従来の TEX から継承されています。

これはあなたが述べたエラーを生成します(これは無限ループなので、依存するエラー状態の場合は終了します。

\documentclass{article}

\begin{document}

\loop
\iftrue
\advance\count0 1
\expandafter\def\csname zzz\the\count0\endcsname{}
\repeat
\end{document}

これにより

LaTeX2e <2019-10-01> patch level 3

luaotfload | main : initialization completed in 2.242 seconds
(/usr/local/texlive/2019/texmf-dist/tex/latex/base/article.cls
Document Class: article 2019/10/25 v1.4k Standard LaTeX document class
(/usr/local/texlive/2019/texmf-dist/tex/latex/base/size10.clo)) (./cc372.aux)
! TeX capacity exceeded, sorry [number of strings=493861].

次のように呼び出すことで(またはtexmf.cnfを編集することで)文字列の数を増やすことができます。

$ max_strings=1000000 lualatex cc372
This is LuaTeX, Version 1.10.0 (TeX Live 2019) 
 restricted system commands enabled.
(./cc372.tex
LaTeX2e <2019-10-01> patch level 3

luaotfload | main : initialization completed in 2.141 seconds
(/usr/local/texlive/2019/texmf-dist/tex/latex/base/article.cls
Document Class: article 2019/10/25 v1.4k Standard LaTeX document class
(/usr/local/texlive/2019/texmf-dist/tex/latex/base/size10.clo)) (./cc372.aux)
! TeX capacity exceeded, sorry [hash size=665536].
<recently read> \endcsname 

文字列が不足しているのではなく、ハッシュ テーブルがオーバーフローしていることがわかります。ハッシュ テーブルも同様に増加できます。必要なものを増やすには、実際のドキュメントを反復処理する必要があります。

ここで、ハッシュ テーブルのサイズを十分に増やすと、実行に数秒かかりますが、最終的には再び文字列が不足します。

$ max_strings=1000000 hash_extra=1000000 lualatex cc372
This is LuaTeX, Version 1.10.0 (TeX Live 2019) 
 restricted system commands enabled.
(./cc372.tex
LaTeX2e <2019-10-01> patch level 3

luaotfload | main : initialization completed in 2.187 seconds
(/usr/local/texlive/2019/texmf-dist/tex/latex/base/article.cls
Document Class: article 2019/10/25 v1.4k Standard LaTeX document class
(/usr/local/texlive/2019/texmf-dist/tex/latex/base/size10.clo)) (./cc372.aux)
! TeX capacity exceeded, sorry [number of strings=993861].

答え2

lualatex.iniDavid Carlisle が提案した値を使用するように編集し、フォーマットを再構築するとうまくいきました。満足しています。

私のlualatex.iniファイル:

main_memory=12000000
pool_size=4250000
max_strings=8000000
hash_extra=1000000

パスを見つけるために、MikTeX コンソールを開いて、[設定] > [ディレクトリ] > (config というラベルの付いたもの) に移動しました。そのフォルダーを開いて、./miktex/config/lualatex.iniそこから進んでください。ありがとうございます!

関連情報