Erreur: main memory size=3000000

Bonsoir à tous,

Je suis dans la rédaction d'un document qui semble être trop long pour tex, puisqu'il me renvoie le message: "! TeX capacity exceeded, sorry [main memory size=3000000]."

Quelqu'un sait-il comment faire pour régler ce problème?

Pour le moment j'ai continué la suite de mon document dans un autre fichier tex, mais j'aimerais bien pouvoir faire tenir le tout dans un même fichier, même s'il doit faire environ 100 pages au final.

Je vous remercie d'avance pour votre aide!

Réponses

  • Bonsoir

    Juste avant d'aller me coucher, je ne peux que te conseiller ceci, avant peut-être une meilleure intervention.

    Cordialement,

    Thierry
    Le chat ouvrit les yeux, le soleil y entra. Le chat ferma les yeux, le soleil y resta. Voilà pourquoi le soir, quand le chat se réveille, j'aperçois dans le noir deux morceaux de soleil. (Maurice Carême).
  • @Thierry Poma merci pour votre réponse!

    Malheureusement, je suis déjà tombé sur cette page avant de poster ici, et cela ne m'a pas aidé (je n'ai pas compris ce qu'ils disent de faire)... quelqu'un peut-il m'expliquer?
  • Bonjour,

    Souvent, quand les gens postent ce genre de message, c'est qu'il y a une erreur dans leur code ; mais il peut arriver que non, qu'ils utilisent simplement un algorithme qui consomme plus de mémoire que ce qui a été prévu lors de la création des formats. Dans ce cas, on peut modifier l'algorithme ou « élargir TeX » comme indiqué sur la page que Thierry a mise en lien (réponse de Leo Liu). Ça m'est arrivé une ou deux fois. J'ai alors créé /etc/texmf/texmf.d/00local-increase-memory-size.cnf avec pour contenu :
    main_memory = 8000000   % words of inimemory available; also applies to inimf&mp
    extra_mem_top = 70000000 % extra high memory for chars, tokens, etc.
    extra_mem_bot = 70000000 % extra low memory for boxes, glue, breakpoints, etc.
    
    et refait les formats ('fmtutil-sys --all'). C'est du TeX Live packagé par Debian, à adapter selon la distribution.

    Comme le montrent certaines réponses de la page de TeX.SE, d'autres approches peuvent être pertinentes selon la cause du problème.
  • @Brian merci pour votre réponse. Je suis désolé, mais je n'ai pas compris où (ni comment) créer le fichier /etc/texmf/texmf.d/00local-increase-memory-size.cnf et comment modifier le contenu.

    De plus, s'il s'agit d'un problème de code, je me suis demandé si cela n'avait pas un rapport avec "pgf" comme semble l'indiquer la page partagée par Thierry Poma: j'ai en effet utilisé dans le document le code que vous m'aviez proposé dans cette page: http://www.les-mathematiques.net/phorum/read.php?10,2247114 , avec les marques pgf (mais sans utiliser le package "pgfplots" dont ils parlent dans la page indiquée par Thierry Poma, donc je ne suis pas sûr qu'il s'agisse du problème).

    Voici le message d'erreur plus complet:

    ! TeX capacity exceeded, sorry [main memory size=3000000].
    <argument> \pgfkeysvalueof {/pgf
    /outer xsep}
    l.6636 \end{pNiceMatrix}}
    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:
    128414 strings out of 478813
    2713978 string characters out of 2855045
    3000001 words of memory out of 3000000
    145898 multiletter control sequences out of 15000+600000
    432215 words of font info for 104 fonts, out of 8000000 for 9000
    1141 hyphenation exceptions out of 8191
    77i,17n,83p,1104b,13798s stack positions out of 5000i,500n,10000p,200000b,80000s
    ! ==> Fatal error occurred, no output PDF file produced!

    Voici les lignes 6628 à 6636 de mon code (dont le message d'erreur parle):
    \vspace{\zoooootb}
    \UneMatrice{\begin{pNiceMatrix}[margin]
     1 & 0 & 0 & -2 & 7 & 5 & 1 \\
     0 & -4 & 1 & -4 & 16 & 16 & 0 \\
     0 & 2 & 3 & 2 & -6 & -6 & 2 \\
     0 & 0 & 0 & 10 & -24 & -20 & -4 \\
     0 & -1 & -1 & -11 & 28 & 24 & 4 \\
     0 & 1 & 1 & 1 & 0 & 0 & 4 \\
    \end{pNiceMatrix}}
    
    Les notations sont celles introduites dans la page que j'ai indiquée sur l'alignement des blocs.

    Enfin, quand je tape "kpsewhich -a texmf.cnf" dans un terminal (Windows + R sur windows) comme indiqué dans la page partagée par @Brian, rien ne se passe...
    Merci d'avance pour vos réponses !

    Edit: je viens de tenter d'effectuer la série d'instructions proposée ici: https://tex.stackexchange.com/questions/7953/how-to-expand-texs-main-memory-size-pgfplots-memory-overload/7954#7954
    (initexmf --edit-config-file=latex , puis main_memory=12000000 puis initexmf --dump=latex puis idem avec pdflatex), mais ça n'a pas marché; le nouveau message d'erreur:

    ! TeX capacity exceeded, sorry [pool size=2855045].
    \__nicematrix_env: ...se:N \g__nicematrix_env_int
    l.7735 \end{pNiceMatrix}}
    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:
    135460 strings out of 478813
    2855045 string characters out of 2855045
    3105376 words of memory out of 12000000
    152944 multiletter control sequences out of 15000+600000
    432215 words of font info for 104 fonts, out of 8000000 for 9000
    1141 hyphenation exceptions out of 8191
    77i,17n,83p,1104b,12548s stack positions out of 5000i,500n,10000p,200000b,80000s
    ! ==> Fatal error occurred, no output PDF file produced!
  • Comme je l'ai écrit, /etc/texmf/texmf.d/00local-increase-memory-size.cnf, c'est pour ceux qui utilisent la distribution TeX Live packagée par Debian. Si tu utilises une autre distribution, il faut évidemment adapter. Apparemment, tu as trouvé (initexmf, etc.). Il faut bien lire tout le message (je suppose que tu voulais mettre ça) — sur pdflatex, lualatex, etc.

    Je ne sais pas avec quel moteur TeX tu compiles, ne connais pas bien cette distribution et n'ai pas envie d'écrire 10 pages envisageant tout un tas d'hypothèses sur ton système et ton “workflow” parce que je n'en sais rien, pour qu'in fine ce soit inutile — toute ressemblance avec un fil récent serait purement fortuite.

    Ton message d'erreur a changé ; tu es peut-être sur la bonne voie, il faut peut-être augmenter la 'pool size', maintenant. Si ça ne marche pas, il y a de bonnes chances que la cause première soit une erreur dans le code. Dans ce cas, il faut préparer un exemple complet minimal.
  • @Brian c'est d'accord. J'utilise MikTeX avec TexMaker et je compile en PDFLateX ou le plus souvent en "compilation rapide" (si cela peut aider). Je vais essayer de travailler avec "pool size" en regardant ce qui est dit sur internet à propos de cette erreur. Si ça ne marche pas j'essayerai de trouver la source du problème, mais comme je ne sais pas d'où elle vient ça risque d'être compliqué de trouver un exemple minimal (d'autant plus que c'est pour un livre qui sera publié donc je ne peux malheureusement pas poster trop de bouts du fichier tex).
  • Utilise la dichotomie. « Avec tout ça, ça ne marche pas. Si j'enlève telle moitié (tout en conservant une syntaxe valide), ça marche. Je remets une des moitiés de la moitié, ça marche ou non ? Etc. »

    Un exemple complet minimal, c'est... minimal. Le texte restant peut se limiter au nom du fameux château d'Arrrggghhh, ça ne me pose aucun problème.
  • @Brian Merci très bonne idée! je n'y avais pas pensé! :-D
    Par contre est-il possible que ça soit un problème de taille du document (environ 100 pages en tout) et que par conséquent ça plantera forcément à un moment quelle que soit la partie que j'enlèverai/garderai?
  • Oui, c'est possible, même avec 0 page — tout dépend de ce que l'on fait faire à TeX. Je connais des documents de plusieurs centaines de pages qui ne nécessitent aucun réglage particulier.

    Comme tu compiles avec pdflatex, d'après le lien précédent, tu peux essayer :
    initexmf --edit-config-file=pdflatex
    
    Si aucun réglage n'apporte satisfaction, il faudra bien se pencher sur le code.
  • Après pas mal d'essais, je n'ai malheureusement pas réussi à créer de fichier minimal qui ne compile pas: je suis arrivé à deux "moitiés" de chapitre qui compile chacune séparément, mais quand je les assemble en un seul fichier ça me renvoie le message d'erreur sur pool size. :-(
  • D'après le TeXbook p.  300 :
    number of strings (names of control sequences and files)
    pool size (the characters in such names)
    La “pool size“ est donc le nombre maximal de caractères (~ octets) disponibles pour l'ensemble des noms de macros et de fichiers utilisés par ton document. Soit tu trouves un moyen de réduire le nombre de caractères utilisés (p. ex., pas d'explosion du nombre de macros définies et/ou noms plus courts), soit tu augmentes la “pool size” (pour le format 'pdflatex' comme déjà dit, pas 'latex' puisque tu compiles avec 'pdflatex' d'après ce que j'ai compris).

    Il est très possible que \global\let\unemacro\undefined permette de récupérer la “pool size” utilisée par (le nom de) \unemacro lorsque celle-ci n'est plus utilisée (non testé).

    D'autre part, le manuel de LuaTeX dit (Implementation notes, Memory allocation) :
    The input line buffer and pool size are now also reallocated when needed, and the texmf.cnf settings buf_size and pool_size are silently ignored.
    ce qui confirme un des éléments sur lesquels j'ai essayé d'attirer ton attention plus haut. As-tu essayé avec LuaTeX ?
  • @Brian désolé de répondre aussi tard (il y a eu un décès dans ma famille, et j'ai été pas mal occupé avec ça ces derniers jours).

    Merci beaucoup pour l'idée de compiler avec LuaLaTeX: ça semble marcher!!! :-D

    Sinon (juste pour savoir) l'idée pour "\global\let\unemacro\undefined" était de mettre ça dans le préambule pour toutes les macros qui n'étaient pas utilisées? Et que signifie exactement le terme "macro"? Est-ce que cela comprend les packages importés, les environnements utilisés, les symboles mathématiques supplémentaires éventuellement définis dans le préambule (auquel cas si tout ça n'est pas utilisé, ne suffirait-il pas de ne pas les mettre dans le préambule)?

    Merci encore pour votre aide!
  • Toutes mes condoléances pour le décès. :-(

    Concernant le \global\let\unemacro\undefined, inutile d'essayer de vider l'océan avec une cuillère.

    1) Dans le contexte ci-dessus, je considère qu'une macro est soit un \controlsequencetoken auquel on a donné une définition au moyen de \def, \edef ou \xdef, soit un \controlsequencetoken \let-équivalent à une macro (les \countdef tokens, \dimendef tokens, \skipdef tokens, etc. ne sont pas des macros mais contribuent probablement aussi à occuper le “pool” ; les caractères actifs auxquels on a donné une définition se comportent comme des macros lors du développement mais ne contribuent sans doute pas à occuper le “pool”).

    2) Si tu définis \macroI et \autremacroIV (note qu'on peut très bien utiliser des chiffres de 0 à 9 et même de la ponctuation dans un nom de macro en passant par \csname ou \csdef d'etoolbox), ces macros occuppent au moins $6 + 12 = 18$ caractères dans le “pool”, selon mon interprétation de la phrase du TeXbook sus-citée (même chose avec les noms de fichiers ouverts par TeX, eux aussi dans le “pool”, apparemment). Ce n'est rien, mais si un algorithme définit des macros à la volée, de manière dynamique, alors avec un grand nombre de macros ou des noms excessivement longs, il peut faire déborder le “pool” — sauf lorsque la mémoire constituant ce dernier est allouée dynamiquement, mais celle de l'ordinateur est elle aussi finie.

    3) Supposons que j'aie un tel algorithme, que je sois en mesure de le comprendre et de le modifier.
    1. Ou bien je trouve un moyen de réduire drastiquement le nombre de macros et/ou la place occupée par leurs noms.
    2. Ou bien je dis à mes utilisateurs d'utiliser un moteur TeX qui alloue dynamiquement la mémoire constituant le “pool”.
    Dans le cas (a), il se peut très bien que mon algorithme utilise potentiellement 1000000 noms de macros différents mais n'ait pas besoin de plus de 100 macros distinctes à un instant $t$. C'est là que le \global\let\unemacro\undefined peut peut-être aider (non testé), pour libérer la mémoire associée à une macro lorsqu'on n'en a plus besoin. (Ne pas le faire s'apparente à une fuite mémoire [un “memory leak”] dans les langages de programmation conventionnels.)

    Mais tu te doutes bien qu'il ne sert à rien de faire ça pour quelques dizaines de macros qui ne servent qu'au début du document. Si une telle technique doit être utilisée, c'est au cœur d'un algorithme qui crée des tas de macros comme un gros goret. :-)
Connectez-vous ou Inscrivez-vous pour répondre.