Obtenha mais de 2 GB de limite para criar PDFs com o ImageMagick

19

Estou usando convert para criar um arquivo PDF a partir de 2.000 imagens:

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

O processo termina reproduzível quando o arquivo de saída atingiu 2 ^ 31-1 bytes (2 GB −1) com a mensagem

convert: unknown 'out.pdf'.

A especificação de arquivo PDF permite ≈10 GB . Tentei extrair mais informações de -debug all , mas não vi nada de útil na saída do registro. O sistema de arquivos é o ext3 que permite arquivos com pelo menos até 16 GiB (pode ser mais) . Quanto ao ulimit , file size é unlimited . /etc/security/limits.conf contém apenas linhas comentadas. O que mais pode causar isso e como posso aumentar o limite?

Versão do ImageMagick: 6.4.3 2016-08-05 Q16 OpenMP | Distribuição: SLES 11.4 (i586)

    
por Paramaeleon 16.08.2017 / 12:11

3 respostas

24

Sua limitação não se origina do sistema de arquivos; ou de versões de pacotes eu acho .

Seu limite de 2 GB está vindo de você usando uma versão de 32 bits do seu sistema operacional.

A opção para aumentar o arquivo seria instalar uma versão de 64 bits se o hardware suportar .

Veja Suporte a arquivos grandes

Traditionally, many operating systems and their underlying file system implementations used 32-bit integers to represent file sizes and positions. Consequently, no file could be larger than 232 − 1 bytes (4 GB − 1). In many implementations, the problem was exacerbated by treating the sizes as signed numbers, which further lowered the limit to 231 − 1 bytes (2 GB − 1).

    
por 16.08.2017 / 12:55
12

Tente limitar o cache de pixels usado por convert para, por exemplo. 1 GiB:

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

Espero que isso forçará o ImageMagic a despejar regularmente dados já processados no disco em vez de tentar encaixar mais de 2 GiB em buffers de RAM.

BTW, a quantidade de memória virtual disponível para um único processo no Linux de 32 bits é definida pela configuração de configuração do kernel VMSPLIT . Isso pode ser 2G / 2G (2GB para kernel + 2GB para userland) ou 1G / 3G (1 GB para kernel + 3 GB para userland). Em um sistema em execução, a configuração pode ser encontrada via

zcat /proc/config.gz | grep VMSPLIT

Em alguns sistemas, a configuração do kernel é armazenada em /boot/config-$(uname -r) .

    
por 16.08.2017 / 14:32
1

Se não fosse pelo grande número de fotografias, você poderia usar o TeX / LaTeX para criar o PDF. Então você ainda pode obter o mesmo resultado (pdf de imagens) sem o problema de travamento do conversor. Os limites de arquivo no TeX devem ser apenas o seu sistema (hardware + SO)

Mas eu acho que você poderia usar um script de shell para escrever o TeX:

0)

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

1) crie um modelo

1.1) Eu tenho certeza que há uma maneira de fazer este passo de uma só vez, substituindo o nome da imagem pela variável e inserindo ao invés de anexar, e para formatar $ FOO para ter o 0 correto, mas o seguinte é apenas o que eu sei.

1.2) O modelo precisa ser dividido para que o script insira o nome do arquivo

1.3) nano tmplt1 / * ou editor de sua escolha * /

/* 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) No entanto, seus arquivos vão para 0001.miff… 0010.miff… 0100.miff… 2000.miff. Ou seja, um número variável de zeros à esquerda. Solução alternativa: 4 versões de tmplt1: tmplt1-9, tmplt10-99, tmplt100-999, tmplt1000-2000. Tmplt1-9 termina “... width] {000” (isto é, adiciona 3 0's); tmplt10-99 termina "... width] {00" (isto é, adicione 2 0's). 100-999 adiciona 1 zero e 1000-2000 é o mesmo que tmplt1

1.4) próxima parte do template: nano tmplt2 / * OEOYC * /

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

1.5) próxima parte do template: 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) próximo modelo: nano tmplt4 / * OEOYC * /

    }
\end{figure}

2) faça o início do arquivo: nano head / * OEOYC * /

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

3) faça o final do arquivo: nano foot / * OEOYC * /

\end {document} 

4) faça o script: 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) Torne o script executável: chmod u + x loader

5.1) Depois de testar isso, descobri que toda vez que $ FOO foi inserido, ele foi distribuído em 3 linhas. Eu não conheço nenhuma solução além de entrar no script e excluir manualmente os retornos de carro. Pelo menos é apenas 36 para todas as 2000 fotos

6) script de chamada: loader

7) compile o TeX: pdflatex out.pdf

    
por 17.08.2017 / 15:04