ImageMagick을 사용하여 PDF를 생성할 때 2GB 제한을 초과합니다.

ImageMagick을 사용하여 PDF를 생성할 때 2GB 제한을 초과합니다.

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바이트(4GB − 1) 보다 클 수 없습니다 . 많은 구현에서 크기를 부호 있는 숫자로 처리하여 문제가 더욱 악화되며, 이로 인해 제한이 2 31 − 1바이트(2GB − 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(커널용 2GB + 사용자 영역용 2GB) 또는 1G/3G(커널용 1GB + 사용자 영역용 3GB)일 수 있습니다. 실행 중인 시스템에서는 다음을 통해 설정을 찾을 수 있습니다.

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의 형식을 지정하여 올바른 선행 0을 갖도록 하는 방식으로 이 단계를 한 번에 수행할 수 있는 방법이 있다고 확신합니다. 그러나 다음은 제가 설명한 것입니다. 알다.

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가 됩니다. 즉, 앞에 오는 0의 가변 개수입니다. 해결책: tmplt1에는 tmplt1-9, tmplt10-99, tmplt100-999, tmplt1000-2000의 4가지 버전이 있습니다. tmplt1-9는 "...width]{000"으로 끝납니다(즉, 3개의 0을 추가합니다). tmplt10-99는 "...width]{00"으로 끝납니다(즉, 2개의 0을 추가합니다). 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

관련 정보