web-dev-qa-db-ja.com

ImageMagickでPDFを作成すると2 GBの制限を超える

convertを使用してPDF約2,000の画像からファイルを作成しています:

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

出力ファイルが次のメッセージで2 ^ 31-1バイト(2 GB -1)に達すると、プロセスは再現可能で終了します。

convert: unknown `out.pdf'.

PDFファイル指定 ≈10GBを許可-debug allから詳細情報を取得しようとしましたが、ログに役立つ情報がありませんでした出力。ファイルシステムはext3で、これは 少なくとも16までのファイルを許可しますGiB(おそらくそれ以上))ulimitに関しては、file sizeunlimitedです。/etc/security/limits.confにはコメント化された行のみが含まれます。他に何がこれを引き起こす可能性がありますか制限を増やすにはどうすればよいですか?

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

19
Matthias Ronge

あなたの制限は確かにファイルシステムに由来するものではありません。またはパッケージバージョンから私は思います

2 GBの制限は、32ビットバージョンのOSを使用している場合に発生します。

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

参照 大きなファイルのサポート

従来、多くのオペレーティングシステムとその基盤となるファイルシステムの実装では、32ビット整数を使用してファイルのサイズと位置を表していました。したがって、2を超えるファイルはありません。32 − 1バイト(4 GB − 1)。多くの実装では、サイズを符号付き数値として扱うことで問題が悪化し、さらに制限が2に低下しました。31 − 1バイト(2 GB − 1)。

24
Rui F Ribeiro

convertが使用するピクセルキャッシュを、たとえば1 GiB:

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

うまくいけば、これにより、ImageMagicは、2つ以上GiB in RAM buffers。

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

_zcat /proc/config.gz | grep VMSPLIT
_

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

12

膨大な数の写真が必要でない場合は、TeX/LaTeXを使用してPDFを作成できます。その後、コンバーターのクラッシュの問題なしに、同じ結果(画像のPDF)を取得できます。 TeXのファイル制限は、ご使用のシステム(ハードウェア+ OS)のみである必要があります

しかし、シェルスクリプトを使用してTeXを記述できると思います。

0)

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

1)テンプレートを作成する

1.1)イメージ名を変数で置き換え、追加ではなく挿入することで、このステップを一度に実行し、正しい先頭に0が付くように$ 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の4つのバージョン:tmplt1-9、tmplt10-99、tmplt100-999、tmplt1000-2000。 Tmplt1-9は「... width] {000」で終わります(つまり、3つの0を追加します); tmplt10-99は、「... width] {00」で終了します(つまり、2つの0を追加します)。 100-999は1つのゼロを追加し、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

1