Nhận giới hạn hơn 2 GB khi tạo tệp PDF bằng ImageMagick


19

Tôi đang sử dụng convertđể tạo một tệp PDF từ khoảng 2.000 hình ảnh:

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

Quá trình kết thúc có thể lặp lại khi tệp đầu ra đã đạt 2 ^ 31-1 byte (2 GB 1) với thông báo

convert: unknown `out.pdf'.

Đặc tả tệp PDF cho phép ≈10 GB . Tôi đã cố gắng lấy thêm thông tin từ -debug allnhưng tôi không thấy có gì hữu ích trong đầu ra đăng nhập. Hệ thống tập tin là ext3cho phép cho các tập tin ít nhất lên đến 16 GiB (có thể nhiều hơn) . Như ulimit, file sizeunlimited. /etc/security/limits.confchỉ chứa các dòng nhận xét. Điều gì khác có thể gây ra điều này và làm thế nào tôi có thể tăng giới hạn?

Phiên bản ImageMagick: 6.4.3 2016-08-05
Phân phối OpenMP Q16 : SLES 11.4 (i586)


4
Có thể bạn tạo hai tệp với một nửa hình ảnh (hoặc bất cứ thứ gì phù hợp với bạn nhất), sau đó hợp nhất chúng với pdftk?
Gallifreyan

1
Bạn có bất kỳ lý do chính đáng để tạo tệp PDF> 2 Gb không? Tôi sợ rằng nhiều trình đọc PDF sẽ gặp sự cố khi mở nó.
dr01

Bởi vì bản sao ImageMagick của bạn đã được biên dịch mà không cần Hỗ trợ tệp lớn. Vui lòng gửi một lỗi - đó là năm 2017.
Tái lập Monica - M. Schröder

@ dr01: Tại sao họ nên? Hỗ trợ tệp lớn đã có từ nhiều thập kỷ.
Phục hồi Monica - M. Schröder

@ MartinSchröder Và một số chương trình không thể xử lý các tệp quá lớn. Dù sao, tôi đã tò mò về lý do tạo ra tệp PDF 2 Gb (nghĩa là ~ 150'000 trang A4).
dr01

Câu trả lời:


24

Giới hạn của bạn không thực sự xuất phát từ hệ thống tập tin; hoặc từ các phiên bản gói tôi nghĩ .

Giới hạn 2GB của bạn đến từ bạn khi sử dụng phiên bản 32 bit của HĐH.

Tùy chọn tăng tệp sẽ là cài đặt phiên bản 64 bit nếu phần cứng hỗ trợ .

Xem hỗ trợ tệp lớn

Theo truyền thống, nhiều hệ điều hành và triển khai hệ thống tệp cơ bản của chúng đã sử dụng số nguyên 32 bit để thể hiện kích thước và vị trí tệp. Do đó, không có tệp nào có thể lớn hơn 2 32 - 1 byte (4 GB - 1). Trong nhiều triển khai, vấn đề đã trở nên trầm trọng hơn bằng cách coi các kích thước là số đã ký, điều này tiếp tục hạ thấp giới hạn xuống 2 31 - 1 byte (2 GB - 1).


3
Lưu ý bên lề: Linux có thể sử dụng kích thước và vị trí tệp 64 bit ngay cả trên 32 bit kể từ khoảng một thập kỷ trước. Mặc dù không chắc chắn, công cụ tạo pdf này có thể sử dụng chức năng này.
peterh nói phục hồi Monica

2
@peterh có 64 bit off_tsẽ không giúp ích nếu phần mềm cố gắng tạo toàn bộ tệp trong RAM và ghi nó vào đĩa trong một lần.
Dmitry Grigoryev

2
Linux không coi kích thước là đã ký, nhưng kernel cần một số không gian địa chỉ chuyên dụng để hoạt động và ngày xưa, việc để lại 2GB cho người dùng dường như rất nhiều, vì vậy kernel sẽ dự trữ 2GB khác.
Dmitry Grigoryev

2
@DmitryGrigoryev: Kích thước không được ký, nhưng khác biệt về con trỏ ( ptrdiff_t) có nghĩa là kích thước phải được giới hạn ở giá trị tối đa (đã ký) ptrdiff_tcó thể đại diện, nếu không bạn sẽ gặp các lỗi liên quan đến UB và UB thực sự khó chịu mà các ứng dụng không có cách tốt để làm việc xung quanh.
R ..

@DmitryGrigoryev Trong trường hợp đó, tệp sẽ không có chính xác 2GB-1 byte, vì chương trình cần thêm bộ nhớ để lưu trữ những thứ như mã thực thi.
dùng23013

12

Hãy thử giới hạn bộ đệm pixel được sử dụng bởi convertví dụ 1 GiB:

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

Hy vọng rằng điều này sẽ buộc ImageMagic thường xuyên đổ dữ liệu đã xử lý vào đĩa thay vì cố gắng phù hợp hơn 2 GiB trong bộ đệm RAM.

BTW, dung lượng bộ nhớ ảo khả dụng cho một tiến trình đơn trên Linux 32 bit được xác định bởi VMSPLITcài đặt cấu hình kernel. Đây có thể là 2G / 2G (2GB cho kernel + 2GB cho userland) hoặc 1G / 3G (1 GB cho kernel + 3 GB cho userland). Trên hệ thống đang chạy, có thể tìm thấy cài đặt qua

zcat /proc/config.gz | grep VMSPLIT

Trên một số hệ thống, cấu hình kernel được lưu trữ /boot/config-$(uname -r)thay thế.


1

Nếu không có số lượng ảnh khổng lồ, bạn có thể sử dụng TeX / LaTeX để tạo PDF. Sau đó, bạn vẫn có thể nhận được kết quả tương tự (pdf hình ảnh) mà không gặp sự cố chuyển đổi. Giới hạn tệp trên TeX chỉ là hệ thống của bạn (phần cứng + HĐH)

Nhưng tôi nghĩ bạn có thể sử dụng tập lệnh shell để viết TeX:

0)

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

1) tạo mẫu

1.1) Tôi chắc chắn có một cách để thực hiện bước này trong một lần, bằng cách thay thế tên hình ảnh bằng biến và chèn thay vì nối thêm và định dạng $ FOO để có 0 chính xác, nhưng sau đây chỉ là những gì tôi biết .

1.2) Mẫu cần phân tách để tập lệnh chèn tên tệp

1.3) nano tmplt1 / * hoặc biên tập viên bạn chọn * /

/* white space line */ 
\begin{figure}[h!]
    \includegraphics[width=0.5\linewidth]{
/* at this point the script will insert $FOO, the file name variable */

Tuy nhiên Tức là một số lượng khác nhau của số không hàng đầu. Giải pháp thay thế: 4 phiên bản của tmplt1: tmplt1-9, tmplt10-99, tmplt100-999, tmplt1000-2000. Tmplt1-9 kết thúc vào chiều ... chiều rộng] {000, (tức là thêm 3 0); tmplt10-99 kết thúc đường dẫn ... chiều rộng] {00 đường (tức là thêm 2 0). 100-999 thêm 1 không và 1000-2000 giống như tmplt1

1.4) phần tiếp theo của mẫu: nano tmplt2 / * OEOYC * /

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

1.5) phần tiếp theo của mẫu: 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) mẫu tiếp theo: nano tmplt4 / * OEOYC * /

    }
\end{figure}

2) bắt đầu tập tin: đầu nano / * OEOYC * /

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

3) tạo phần cuối của tệp: chân nano / * OEOYC * /

\end {document} 

4) tạo tập lệnh: bộ tải nano / * 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) tạo tập lệnh thực thi: chmod u + x loader

5.1) Sau khi thử nghiệm điều này, tôi thấy rằng mỗi lần chèn $ FOO, nó được trải ra trên 3 dòng. Tôi không biết bất kỳ cách giải quyết nào khác ngoài việc đi vào kịch bản và xóa thủ công trả lại xe ngựa. Ít nhất nó chỉ có 36 cho tất cả 2000 bức ảnh

6) tập lệnh gọi: bộ nạp

7) biên dịch TeX: pdflatex out.pdf

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.