ImageMagickでPDFを作成する際に2 GBの制限を超えます


19

convert約2,000個の画像からPDFファイルを作成するために使用しています。

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

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

convert: unknown `out.pdf'.

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

ImageMagickバージョン:6.4.3 2016-08-05 Q16 OpenMP
ディストリビューション:SLES 11.4(i586)


4
画像の半分(または自分に最適なもの)で2つのファイルを作成し、pdftkにマージすることは可能ですか?
ガリフレヤン

1
2 Gb以上のPDFファイルを作成する理由はありますか?多くのPDFリーダーがそれを開こうとするとクラッシュするのではないかと心配しています。
dr01

ImageMagickのコピーは、ラージファイルサポートなしでコンパイルされているためです。バグを提出してください-それは2017
。–モニカを回復-M.シュレーダー

@ dr01:なぜそうすべきなのか?大規模ファイルのサポートは数十年前から存在しています。
モニカの復職-M.シュレーダー

@MartinSchröderさらに、一部のプログラムは大きすぎるファイルを処理できません。とにかく、2Gb(つまり、150,000 A4ページまで)PDFファイルを作成する理由に興味がありました。
dr01

回答:


24

実際の制限は、ファイルシステムに起因するものではありません。または私が思うパッケージバージョンから。

OSの32ビットバージョンを使用することで、2GBの制限が発生します。

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

大容量ファイルのサポートをご覧ください

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


3
サイドノート:Linuxは、約10年前から64ビットのファイルサイズと位置を32ビットでも使用できます。確かではありませんが、このpdf生成ツールがこの機能を使用できるかどうか。
ペテルはモニカを復活させると

2
off_tソフトウェアがRAMにファイル全体を作成し、ディスクに一度に書き込もうとすると、64ビットの@peterhは役に立ちません。
ドミトリーグリゴリエフ

2
Linuxはサイズを符号付きとして扱いませんが、カーネルは機能するためにいくつかの専用アドレススペースを必要とし、かつて2GBをユーザーランドに残すことは多くのように思われたため、カーネルは他の2GBを予約します。
ドミトリーグリゴリエフ

2
@DmitryGrigoryev:サイズ署名が、ポインタの違い(されていませんがptrdiff_t)サイズが最大(署名)に制限されなければならないことを効果的に意味している、ある値をptrdiff_t表すことができ、または他のあなたが得る本当に厄介なアプリケーションはありません持っていることUBとUB-関連のバグを回避する良い方法。
R ..

@DmitryGrigoryevその場合、プログラムは実行可能コードなどを保存するためにより多くのメモリを必要とするため、ファイルには正確に2GB-1バイトはありません。
user23013

12

使用するピクセルキャッシュをconvert、たとえば1 GiBに制限してみてください。

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

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

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

zcat /proc/config.gz | grep VMSPLIT

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


1

膨大な数の写真がなければ、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)イメージ名を変数で置き換えて追加するのではなく挿入することで、この手順を一度に行う方法があると確信しています。 。

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 loader

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.