ImageMagick으로 2GB 이상의 제한적인 PDF 작성 파일이 메시지와 함께

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로깅 출력에 도움이되는 것을 보지 못했습니다. 파일 시스템은 ext3 이며, 최대 16GiB 이상의 파일허용합니다 (더 많을 수 있음) . 에 관해서는 ulimit, file size이다 unlimited. /etc/security/limits.conf주석 처리 된 행만 포함합니다. 이로 인해 다른 원인이 무엇이고 한도를 늘리려면 어떻게해야합니까?

ImageMagick 버전 : 6.4.3 2016-08-05 Q16 OpenMP
배포 : SLES 11.4 (i586)



답변

당신의 한계는 실제로 파일 시스템에서 비롯된 것이 아닙니다. 또는 내가 생각 하는 패키지 버전에서 .

32 비트 버전의 OS를 사용하면 2GB 제한이 발생합니다.

하드웨어에서 지원하는 경우 파일을 늘리는 옵션은 64 비트 버전을 설치하는 입니다.

큰 파일 지원 참조

전통적으로 많은 운영 체제와 기본 파일 시스템 구현은 32 비트 정수를 사용하여 파일 크기와 위치를 나타냅니다. 결과적으로 파일은 2 32-1 바이트 (4GB-1) 보다 클 수 없습니다 . 많은 구현에서 크기를 부호있는 숫자로 처리하여 문제를 악화 시켰으며, 이로 인해 한계가 2 31-1 바이트 (2 GB-1) 로 낮아졌습니다 .


답변

convert1GiB에 사용되는 픽셀 캐시를 제한 해보십시오 .

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

이로 인해 ImageMagic은 RAM 버퍼에 2GiB 이상을 맞추려고하는 대신 이미 처리 된 데이터를 디스크에 정기적으로 덤프해야합니다.

32 비트 Linux에서 단일 프로세스에 사용 가능한 가상 메모리의 양인 BTW는 VMSPLIT커널 구성 설정에 의해 정의됩니다 . 2G / 2G (커널의 경우 2GB + 사용자 영역의 경우 2GB) 또는 1G / 3G (커널의 경우 1GB + 사용자 영역의 경우 3GB) 일 수 있습니다. 실행중인 시스템에서 설정은 다음을 통해 찾을 수 있습니다.

zcat /proc/config.gz | grep VMSPLIT

일부 시스템에서는 커널 구성이 /boot/config-$(uname -r)대신 저장 됩니다.


답변

대량의 사진이 아닌 경우 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) 이미지 이름을 변수로 바꾸고 추가하지 않고 삽입 하여이 단계를 한 번에 수행 할 수있는 방법이 있다고 확신합니다. $ 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의 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


답변