Aumentando a memória

Aumentando a memória

Estou trabalhando em um documento que produz aproximadamente 4.000 páginas, cada uma com pelo menos 30 gráficos por página. Há muita troca de fontes e coloração de caracteres diferentes com cores diferentes. Consigo limitar as páginas geradas, o que me permite compilar com êxito. Estou usando o MikTex de 64 bits, mas notei o mesmo problema ao tentar usar o texLive.

No entanto, quando tento aumentar o número de páginas além de um determinado valor, LuaLaTex termina com:

! 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.

Na verdade, não posso postar um MWE porque acho que a falha vem principalmente da inclusão de imagens milhares de vezes. Estou tentando passar a opção de linha de comando para lualatexwith -extra-mem-top=50000000.

Também tentei editar meu arquivo textmf, mas não pareceu realmente alterar o número mágico (493869) de strings. Também estou executando a versão de 64 bits dos binários porque li que isso poderia ajudar na alocação de memória, mas na verdade não mudou nada.

Responder1

LuaTeX usa alocação dinâmica de memória para mem principal, então a texmf.cnfconfiguração que você está usando não terá efeito mesmo se você definir if para luatex em vez de pdftex.

No entanto, ele ainda herda algum uso de array fixo do tex clássico, incluindo o número de strings.

isso produz o erro que você declara (observe que é um loop infinito, entãodependeem uma condição de erro para terminar.

\documentclass{article}

\begin{document}

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

Isso produz

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].

Você pode aumentar o número de strings chamando-o da seguinte forma (ou editando 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 

Agora você vê que não ficou sem strings, mas estourou a tabela hash, que poderia ser aumentada de forma semelhante. Você precisa iterar em seu documento real para aumentar o que for necessário.

Aqui, se eu aumentar o tamanho da tabela hash o suficiente, ela levará alguns segundos para ser executada, mas eventualmente ficará sem strings novamente:

$ 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].

Responder2

editar lualatex.inipara usar os valores sugeridos por David Carlisle e, em seguida, reconstruir os formatos resolveu o problema. Eu estou feliz.

meu lualatex.iniarquivo:

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

Para encontrar o caminho, abri o console MikTeX e fui Configurações> Diretório> (depois aquele rotulado como configuração). Abra essa pasta e prossiga a ./miktex/config/lualatex.inipartir daí. Obrigado!

informação relacionada