为什么 lualatex 会出现错误“打开的文件太多”,但 pdflatex 在同一个 latex 文件上却不会出现这种情况?

为什么 lualatex 会出现错误“打开的文件太多”,但 pdflatex 在同一个 latex 文件上却不会出现这种情况?

在 Linux 上使用 TL 2015。

我有一个包含图形的 latex 文件,全部为 pdf 格式。所有图像均使用调用包含在内

\includegraphics[width=\textwidth,height=\textheight,keepaspectratio]{rules/file_name}

此类图像一共有 1860 张,全部为 pdf 格式。

当我使用 lualatex 编译此文件时,在某个阶段,当它到达图像编号 1016 时,它会失败并显示错误Too many open files。使用 pdflatex 编译同一文件不会出现任何错误!

使用 lualatex 时,在 latex 文件中可以包含的图像数量是否有限制,或者这是一个错误?看起来 lualatex includegraphics 版本在加载图像时不会关闭文件句柄,并且文件句柄用尽。这是在 Linux mint 7.2 上。

由于文件很大。我把文件和它加载的图像放在\includegraphics一个 zip 文件中(80 MB)。链接位于本文底部。

要重现,请下载 zip 文件,使用命令解压unzip file.zip,它将创建一个名为的新文件夹lualatex_error/,该文件夹内有一个文件report.tex和包含所有图像的文件夹。然后输入

lualatex report.tex

会给出错误

 lualatex: ./rules/1016.pdf: Too many open files

来自report.log

This is LuaTeX, Version beta-0.80.0 (TeX Live 2015) (rev 5238) 
    (format=lualatex 2015.7.9)  31 JUL 2015 12:28
 restricted \write18 enabled.

lualatex_error>which lualatex
/usr/local/texlive/2015/bin/x86_64-linux/lualatex

该 zip 文件位于此文件夹(这是 zip 文件所在文件夹的链接。不是 zip 文件的直接链接)。大小为 80 MB。

我可以提供任何其他信息,请告知我。

答案1

我可以确认这个行为。测试方法如下:

创建 1860 个副本example-image-1x1.pdf(或您选择的其他图像),命名为1.pdf, 2.pdf,..., 1860.pdf。如果您使用bash并且在标准位置安装了 TeX Live 2015,则可以使用以下命令:

i=0; while [ $i -le 1860 ] ; do ((i++)); cp /usr/local/texlive/current/texmf-dist/tex/latex/mwe/example-image-1x1.pdf ./$i.pdf; done

然后创建以下文档:

\documentclass{article}
\usepackage{graphicx}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\int_new:N \l_nasser_loop_int
\tl_new:N \l_nasser_file_tl
\NewDocumentCommand \icing { }
{
  \int_set:Nn \l_nasser_loop_int { 0 }
  \int_do_while:nNnn { \l_nasser_loop_int } < { 1860 }
  {
    \int_incr:N \l_nasser_loop_int
    \tl_set:Nn \l_nasser_file_tl { \int_use:N \l_nasser_loop_int }
    \includegraphics[width=\textwidth,height=\textheight,keepaspectratio]{\l_nasser_file_tl}\par
  }
}
\ExplSyntaxOff
\begin{document}
\icing
\end{document}

使用 可以编译成功pdflatex。使用 则lualatex失败,并出现以下错误:

lualatex: ./1024.pdf: Too many open files

我将避免发布输出结果pdflatex:您要么相信我的话,要么遵循上述步骤。

相关内容