รับมากกว่า 2 GB ในการสร้าง PDF ด้วย ImageMagick


19

ฉันใช้convertเพื่อสร้างไฟล์ PDF จากประมาณ 2,000 ภาพ:

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 ลิ่ม (อาจจะมากขึ้น) ในฐานะที่เป็นulimit, คือfile size มีเพียงบรรทัดที่ใส่ความคิดเห็นเท่านั้น มีอะไรอีกที่ทำให้เกิดสิ่งนี้และฉันจะเพิ่มขีด จำกัด ได้อย่างไรunlimited/etc/security/limits.conf

รุ่น ImageMagick: 6.4.3 2016-08-05 Q16 การ
กระจายOpenMP : SLES 11.4 (i586)


4
เป็นไปได้หรือไม่ที่คุณจะสร้างสองไฟล์ที่มีครึ่งภาพ (หรืออะไรก็ตามที่เหมาะกับคุณที่สุด) แล้วรวมมันเข้ากับ pdftk หรือไม่?
Gallifreyan

1
คุณมีเหตุผลที่ดีในการสร้างไฟล์> 2 Gb PDF หรือไม่? ฉันกลัวว่าผู้อ่าน PDF จำนวนมากจะล้มเหลวในการพยายามเปิด
dr01

เนื่องจากสำเนาของ ImageMagick ของคุณถูกคอมไพล์โดยไม่มีการสนับสนุนไฟล์ขนาดใหญ่ โปรดยื่นข้อบกพร่อง - เป็น 2017.
Reinstate Monica - M. Schröder

@ dr01: ทำไมพวกเขาควร? การรองรับไฟล์ขนาดใหญ่มีมานานนับหลายทศวรรษ
Reinstate Monica - M. Schröder

@ MartinSchröderและบางโปรแกรมไม่สามารถจัดการไฟล์ที่มีขนาดใหญ่เกินไป อย่างไรก็ตามฉันสงสัยเกี่ยวกับสาเหตุของการสร้างไฟล์ PDF 2 Gb (นั่นคือ ~ A4'000 หน้า A4) PDF
dr01

คำตอบ:


24

ข้อ จำกัด ของคุณไม่ได้เกิดจากระบบไฟล์ หรือจากรุ่นแพคเกจผมคิดว่า

ขีด จำกัด 2GB ของคุณมาจากคุณโดยใช้ระบบปฏิบัติการรุ่น 32 บิต

ตัวเลือกในการเพิ่มไฟล์จะได้รับการติดตั้งรุ่น 64 บิตถ้าฮาร์ดแวร์สนับสนุน

ดูที่รองรับไฟล์ขนาดใหญ่

ตามเนื้อผ้าระบบปฏิบัติการหลายระบบและการใช้งานระบบไฟล์พื้นฐานของพวกเขาใช้จำนวนเต็ม 32 บิตเพื่อเป็นตัวแทนของขนาดและตำแหน่งของไฟล์ ดังนั้นไฟล์ไม่สามารถมีขนาดใหญ่กว่า 2 32 - 1 ไบต์ (4 GB - 1) ในการติดตั้งใช้งานจำนวนมากปัญหานี้ทวีความรุนแรงมากขึ้นโดยรักษาขนาดเป็นตัวเลขที่ลงนามซึ่งลดขีด จำกัด ลงเหลือ 2 31 - 1 ไบต์ (2 GB - 1)


3
หมายเหตุด้านข้าง: Linux สามารถใช้ขนาดและตำแหน่งไฟล์ 64- บิตได้แม้กระทั่งบน 32- บิตตั้งแต่ประมาณหนึ่งทศวรรษที่แล้ว แม้ว่าจะไม่แน่ใจว่าเครื่องมือตัวสร้าง PDF นี้สามารถใช้ฟังก์ชันนี้ได้
peterh กล่าวคืนสถานะโมนิก้า

2
@ peterh มี 64- บิตoff_tจะไม่ช่วยถ้าซอฟต์แวร์พยายามที่จะสร้างไฟล์ทั้งหมดใน RAM และเขียนไปยังดิสก์ในครั้งเดียว
Dmitry Grigoryev

2
Linux ไม่ถือว่าขนาดเป็นเซ็น แต่เคอร์เนลต้องการพื้นที่ที่อยู่เฉพาะในการทำงานและในวันเก่าที่เหลือ 2GB ไปยัง userland ดูเหมือนมากดังนั้นเคอร์เนลจะจอง 2GB อื่น ๆ
Dmitry Grigoryev

2
@DmitryGrigoryev: ขนาดไม่ได้ลงนาม แต่ความแตกต่างของตัวชี้ ( ptrdiff_t) คือซึ่งหมายความว่ามีประสิทธิภาพที่ขนาดจะต้อง จำกัด มูลค่าสูงสุด (ลงนาม) ptrdiff_tสามารถเป็นตัวแทนหรืออื่น ๆ ที่คุณได้รับUB และ UB ที่น่ารังเกียจจริงๆวิธีที่ดีในการหลีกเลี่ยง
..

@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 ทำการถ่ายโอนข้อมูลที่ประมวลผลแล้วบนดิสก์เป็นประจำแทนที่จะพยายามใส่มากกว่า 2 GiB ใน RAM buffer

BTW จำนวนหน่วยความจำเสมือนที่มีสำหรับกระบวนการเดียวบน Linux แบบ 32 บิตถูกกำหนดโดยการVMSPLITตั้งค่าเคอร์เนล นี่อาจเป็น 2G / 2G (2GB สำหรับเคอร์เนล + 2GB สำหรับผู้ใช้) หรือ 1G / 3G (1 GB สำหรับเคอร์เนล + 3 GB สำหรับผู้ใช้) บนระบบที่รันอยู่การตั้งค่าสามารถพบได้ผ่าน

zcat /proc/config.gz | grep VMSPLIT

ในบางระบบการกำหนดค่าเคอร์เนลจะถูกเก็บไว้/boot/config-$(uname -r)แทน


1

หากไม่ใช่สำหรับภาพถ่ายจำนวนมากคุณสามารถใช้ 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 คือจำนวนตัวแปรของศูนย์นำหน้า วิธีแก้ปัญหา: 4 เวอร์ชันของ tmplt1: tmplt1-9, tmplt10-99, tmplt100-999, tmplt1000-2000 Tmplt1-9 ลงท้าย“ ... width] {000” (เช่นเพิ่ม 3 0) tmplt10-99 ลงท้าย“ ... width] {00” (เช่นเพิ่ม 2 0 ของ) 100-999 เพิ่ม 1 ศูนย์และ 1,000-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) สร้างสคริปต์: ตัวโหลดนาโน / * 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 บรรทัด ฉันไม่ทราบวิธีแก้ปัญหาอื่นใดนอกจากเข้าไปในสคริปต์และการลบการรับคืนด้วยตนเอง อย่างน้อยก็มีเพียง 36 ภาพจากทั้งหมด 2000 ภาพ

6) สคริปต์การโทร: ตัวโหลด

7) คอมไพล์ TeX: pdflatex out.pdf

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.