ImageMagickを使用してPDFを生成すると、2 GBの制限を超えています。

ImageMagickを使用してPDFを生成すると、2 GBの制限を超えています。

convert約2,000枚の画像を含むPDFファイルを作成しています。

convert 0001.miff 0002.miff ... 2000.miff -compress jpeg -quality 80 out.pdf

メッセージと共に出力ファイルが2^31-1バイト(2GB -1)に達すると、プロセスは繰り返し終了する可能性があります。

convert: unknown `out.pdf'.

PDFファイルの仕様約10GBを許可。私はそれからより多くの情報を取得しようとしましたが、-debug allログ出力で有用なものを見ませんでした。ファイルシステムは外部3どのファイルサイズは少なくとも16GiB(おそらくそれ以上)まで許可されています。。に関してulimitfile sizeそうですunlimited/etc/security/limits.confコメント化された行のみを含めます。また、何がこの問題を引き起こす可能性がありますか?制限を上げるにはどうすればよいですか?

ImageMagickバージョン:6.4.3 2016-08-05 Q16 OpenMP
リリース:SLES 11.4(i586)

答え1

制限は実際にはファイルシステムでは発生しません。またはパッケージバージョンで私の考えでは

2GBの制限は、オペレーティングシステムの32ビットバージョンによって異なります。

ファイルを追加するオプションは、64ビットバージョンをインストールすることです。ハードウェアがサポートしている場合

バラより大容量ファイルのサポート

従来、多くのオペレーティングシステムと基本ファイルシステムの実装では、ファイルサイズと場所を表すために32ビット整数を使用していました。したがって、どのファイルも2 32 - 1バイト(4 GB - 1)を超えることはできません。多くの実装では、サイズを符号付き数値として扱うことで問題がさらに悪化し、これにより制限が2 31 - 1バイト(2 GB - 1)にさらに減少します。

答え2

使用されるピクセルキャッシュをconvert1GiBに制限してみてください。

convert 0001.miff ... 2000.miff -limit memory 1GiB -limit map 1GiB -compress jpeg -quality 80 out.pdf

これにより、ImageMagicがRAMバッファに2GiB以上のデータを合わせようとする代わりに、処理されたデータを定期的にディスクにダンプすることを願っています。

ただし、32ビットLinuxで単一プロセスで使用できる仮想メモリの量は、VMSPLITカーネル構成設定によって定義されます。これは、2G / 2G(カーネル用2 GB +ユーザーゾーン用2 GB)または1G / 3G(カーネル用1 GB +ユーザーゾーン用3 GB)です。実行中のシステムでは、以下を使用して設定を見つけることができます。

zcat /proc/config.gz | grep VMSPLIT

一部のシステムでは、カーネル構成が/boot/config-$(uname -r)ここに保存されます。

答え3

写真が多い場合は、TeX / LaTeXを使用してPDFを作成できます。これにより、コンバータの競合の問題がなくても、同じ結果(画像のPDF)を取得できます。 TeXのファイル制限は、そのシステム(ハードウェア+オペレーティングシステム)にのみ適用する必要があります。

しかし、シェルスクリプトを使ってTeXを書くことができると思います。

0)

mkdir convert
pushd convert
PATH=convert:$PATH /* keep everything in one directory for tidyness.*/

1) テンプレートの作成

1.1)画像名を変数に変更して追加するのではなく、挿入して$FOOをフォーマットして正しい先行ゼロを持つようにこの手順を一度に実行する方法があると確信しています。しかし、以下は私が説明したものです。わかります。

1.2)スクリプトがファイル名を挿入できるようにテンプレートを分割する必要があります。

1.3) nano tmplt1 /* または希望のエディタ*/

/* white space line */ 
\begin{figure}[h!]
    \includegraphics[width=0.5\linewidth]{
/* at this point the script will insert $FOO, the file name variable */

1.3.1)しかし、ファイルは0001.miff … 0010.miff … 0100.miff … 2000.miffになります。つまり、前に来るゼロの可変数です。解決策:tmplt1には、tmplt1-9、tmplt10-99、tmplt100-999、tmplt1000-2000の4つのバージョンがあります。 tmplt1-9 は "...width]{000" で終わります (つまり、3 つのゼロを追加します)。 tmplt10-99 は "...width]{00" で終わります (つまり、2 つのゼロを追加します)。 100-999+1 0, 1000-2000 は tmplt1 と同じです。

1.4) テンプレートの次の部分: nano tmplt2 /* OEOYC */

.miff}
   \caption{ /* if you want to caption, otherwise skip to  tmplt3.
Same again, script will insert $FOO here */

1.5) テンプレートの次の部分: nano tmplt3 /* OEOYC */

}
\label{f:   /*if you want them labelled which is actually
a index/reference for the text to refer to, not a caption.
Same again, the script will insert $FOO here. If you do not
want labels, skip to tmplt4*/

1.6) 次のテンプレート: nano tmplt4 /* OEOYC */

    }
\end{figure}

2) ファイルの先頭を作成: nano head /* OEOYC */

\documentclass{article} /* Or more suitable class */
 \usepackage{graphicx}
 \begin{document}
  /* white space line*/

3) ファイル終了: nano foot /*OEOYC */

\end {document} 

4) 作成スクリプト: nano loader /* OEOYC */

#! /bin/bash

cat head > out.pdf

for FOO in {1...9}
do
    cat tmplt1-9 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt2 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt3 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt4 >> out.pdf
done

for FOO in {10...99}
do
    cat tmplt10-99 >> out.pdf /* this looks like a lot but
is actually copy-paste of first block, just add relevant 0's and 9's */
    echo "$FOO" | cat >> out.pdf
    cat tmplt2 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt3 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt4 >> out.pdf
done

for FOO in {100...999}
do
    cat tmplt100-999 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt2 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt3 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt4 >> out.pdf
done

for FOO in {1000...2000}
do
    cat tmplt1000-2000 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt2 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt3 >> out.pdf
    echo "$FOO" | cat >> out.pdf
    cat tmplt4 >> out.pdf
done

cat foot >> out.pdf

5) スクリプトを実行可能にする: chmod u+x ローダー

5.1)テスト後、$ FOOが挿入されるたびに3行にわたって分散することがわかりました。スクリプトに移動してキャリッジリターンを手動で削除する以外に、回避策はありません。 2000枚のうち少なくとも36枚の写真があります。

6)呼び出しスクリプト:ローダー

7)TeXコンパイル:pdflatex out.pdf

関連情報