Używam convert
do utworzenia pliku PDF z około 2000 obrazów:
convert 0001.miff 0002.miff ... 2000.miff -compress jpeg -quality 80 out.pdf
Proces kończy się odtwarzalnie, gdy plik wyjściowy osiągnie 2 ^ 31-1 bajtów (2 GB -1) z komunikatem
convert: unknown `out.pdf'.
Specyfikacja pliku PDF pozwala na ≈10 GB . Próbowałem pobrać więcej informacji -debug all
, ale nie widziałem nic przydatnego w danych wyjściowych logowania. System plików to ext3, który pozwala na pliki co najmniej do 16 GiB (może być więcej) . Co do ulimit
, file size
jest unlimited
. /etc/security/limits.conf
zawiera tylko skomentowane linie. Co jeszcze może to powodować i jak mogę zwiększyć limit?
Wersja ImageMagick: 6.4.3 2016-08-05 Q16
Dystrybucja OpenMP : SLES 11.4 (i586)
linux
imagemagick
limit
Matthias Ronge
źródło
źródło
Odpowiedzi:
Twoje ograniczenia nie wynikają z systemu plików; lub z wersji pakietu, jak sądzę .
Twój limit 2 GB pochodzi od Ciebie w 32-bitowej wersji systemu operacyjnego.
Opcją zwiększenia pliku byłoby zainstalowanie wersji 64-bitowej, jeśli sprzęt go obsługuje .
Zobacz Obsługa dużych plików
źródło
off_t
nie pomoże, jeśli oprogramowanie spróbuje utworzyć cały plik w pamięci RAM i zapisać go na dysku za jednym razem.ptrdiff_t
) są, co oznacza, że rozmiary muszą być ograniczone do maksymalnej (podpisanej) wartości, któraptrdiff_t
może reprezentować, w przeciwnym razie otrzymasz naprawdę bardzo nieprzyjemne błędy związane z UB i UB, których aplikacje nie mają dobry sposób na obejście.Spróbuj ograniczyć pamięć podręczną pikseli używaną
convert
np. Do 1 GiB:Mamy nadzieję, że zmusi to ImageMagic do regularnego zrzucania już przetworzonych danych na dysk, zamiast próbować zmieścić więcej niż 2 GiB w buforach RAM.
BTW, ilość pamięci wirtualnej dostępnej dla pojedynczego procesu w 32-bitowym systemie Linux jest określona przez
VMSPLIT
ustawienie konfiguracji jądra. Może to być 2G / 2G (2 GB dla jądra + 2 GB dla przestrzeni użytkownika) lub 1G / 3G (1 GB dla jądra + 3 GB dla przestrzeni użytkownika). W działającym systemie ustawienie można znaleźć za pośrednictwemW niektórych systemach konfiguracja jądra jest przechowywana w
/boot/config-$(uname -r)
zamian.źródło
Gdyby nie ogromna liczba zdjęć, można użyć TeX / LaTeX do utworzenia pliku PDF. Wtedy nadal możesz uzyskać ten sam wynik (pdf obrazów) bez problemu z awarią konwertera. Limity plików w TeXie powinny być po prostu twoim systemem (sprzęt + system operacyjny)
Ale myślę, że możesz użyć skryptu powłoki, aby napisać TeX:
0)
1) zrób szablon
1.1) Jestem pewien, że jest sposób, aby zrobić ten krok za jednym razem, zastępując nazwę obrazu zmienną i wstawiając zamiast dodawać, a także sformatować $ FOO, aby mieć prawidłowe początkowe zera, ale następujące jest to, co wiem .
1.2) Szablon musi zostać podzielony, aby skrypt mógł wstawić nazwę pliku
1.3) nano tmplt1 / * lub dowolny edytor * /
1.3.1) Jednak twoje pliki idą 0001.miff… 0010.miff… 0100.miff… 2000.miff. To jest zmienna liczba wiodących zer. Obejście: 4 wersje tmplt1: tmplt1-9, tmplt10-99, tmplt100-999, tmplt1000-2000. Tmplt1-9 kończy „… szerokość] {000” (tzn. Dodaje 3 0); tmplt10-99 kończy „… width] {00” (tzn. dodaje 2 0). 100-999 dodaje 1 zero, a 1000-2000 jest takie samo jak tmplt1
1.4) następna część szablonu: nano tmplt2 / * OEOYC * /
1.5) następna część szablonu: nano tmplt3 / * OEOYC * /
1.6) Następny szablon: nano tmplt4 / * OEOYC * /
2) utwórz początek pliku: nano head / * OEOYC * /
3) zrób koniec pliku: nano foot / * OEOYC * /
4) wykonaj skrypt: nano loader / * OEOYC * /
5) uczynić skrypt wykonywalnym: chmod u + x loader
5.1) Po przetestowaniu tego stwierdziłem, że za każdym razem, gdy wstawiano $ FOO, rozkładało się ono na 3 linie. Nie znam żadnego innego obejścia niż przejście do skryptu i ręczne usuwanie zwrotów karetki. Przynajmniej 2000 na wszystkie 2000 zdjęć
6) skrypt wywołania: moduł ładujący
7) skompiluj TeX: pdflatex out.pdf
źródło