메모리 늘리기

메모리 늘리기

저는 페이지당 최소 30개의 그래픽이 포함된 최대 4000페이지를 생성하는 문서를 작업 중입니다. 다양한 글꼴 전환과 색상, 문자, 색상이 많이 있습니다. 출력되는 페이지를 제한할 수 있으므로 성공적으로 컴파일할 수 있습니다. 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.

결함이 대부분 이미지를 수천 번 포함하는 데서 발생한다고 생각하기 때문에 실제로 MWE를 게시할 수 없습니다. lualatexwith 에 명령줄 옵션을 전달하려고 합니다 -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

David Carlisle이 제안한 값을 사용하도록 편집한 lualatex.ini다음 형식을 재구성하는 것이 성공했습니다. 나는 행복하다.

lualatex.ini파일:

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

경로를 찾기 위해 MikTeX 콘솔을 열고 설정 > 디렉토리 >(그런 다음 config라고 표시된 항목)로 이동했습니다. 해당 폴더를 연 다음 ./miktex/config/lualatex.ini거기에서 이동하십시오. 감사해요!

관련 정보