Konwersja ImageMagick i niska pamięć RAM

12

Rozważ następujące polecenie dla pakietu imagemagick:

sudo convert -resize 460x200 /path/to/test1.jpg /path/to/test2.jpg

Teraz test1.jpgjest dość duży obraz (12,5 MB), ale nie jest to niespotykane rozmiary, ale serwer, z którego pracuję, ma tylko 1G pamięci ( Amazon EC2 t2.micro, jeśli to pomaga)

Błąd nie test2.jpgjest generowany , a jednak nie jest tworzony. Przetestowałem to na mniejszych obrazach i działa dobrze. Pomyślałbym, że 1G, gdyby pamięć wystarczała na zarządzanie zmianą rozmiaru, ale może nie?

Jakie mam opcje, czy muszę uzyskać więcej pamięci, czy coś brakuje?

Wszelkie sugestie są mile widziane!

Żądane zmiany

Dane wyjściowe strace pokazują: +++ killed by SIGKILL +++wraz z dużą ilością poleceń, które wyglądają normalnie (otwieranie /usr/share/locali czytanie długich ciągów, które, jak zakładam, są danymi obrazowymi)

za darmo daje mi:

         total       used       free     shared    buffers     cached
Mem:       1016292     278348     737944       6412        460      13356
-/+ buffers/cache:     264532     751760
Swap:            0          0          0

Wygląda więc na to, że zamiana nie jest włączona, więc spróbuję utworzyć plik wymiany, aby sprawdzić, czy to rozwiąże moje problemy.

Plik daje mi:

testprint10Mbv2.jpg: JPEG image data, EXIF standard

Wkleiłbym również pełny / path / to / img, ale niestety zawiera poufne dane (adresy e-mail klientów itp.)

Aphire
źródło
1
Dlaczego używasz sudotego polecenia?
Charles Green
1
Otrzymałem wiadomość „Zabity”, gdy tego nie zrobiłem
Aphire
3
Ypu może próbować ograniczyć pamięć używaną do buforowania pikseli przy pomocy argumentu -limit memory 64MiB(32MiB jest prawdopodobnie trochę za mały. Domyślnie 1,5GiB). I powinien dać ci jakieś opisowe dane wyjściowe na wypadek niepowodzenia.
dadexix86
2
Spróbuj uruchomić polecenie z stracedołączonym przed nim poleceniem, sprawdź, jakie wywołania systemowe są wykonywane, zgłaszane błędy. Daj nam znać
Sergiy Kolodyazhnyy
2
Gotowy. Cieszę się, że udało Ci się to rozwiązać! wolne wyjście potwierdza, że ​​zamiana jest wyłączona, a informacje o pliku potwierdzają, że nie jest to plik źle zidentyfikowany. Niezła edycja! +1
Starszy Geek

Odpowiedzi:

7

Zakładam, że kończy Ci się pamięć RAM. Możesz to sprawdzić za pomocą, watch cat /proc/meminfogdy proces jest uruchomiony.

Być może masz niewystarczającą ilość pamięci RAM i / lub SWAP, aby wykonać swoje zadanie.

Ze względu na niski stan pamięci RAM upewnij się, że zamiana jest włączona swapon -ai jeśli w systemie nie jest ustawiona zamiana, utwórz partycję do zamiany na nieużywanym miejscu na dysku i włącz ją. To prawdopodobnie rozwiąże problem. Dobra odpowiedź @Takkat na temat tego, jak to zrobić tutaj Jeśli nie masz dostępu do partycjonowania serwera, możesz również użyć pliku wymiany do wymiany

Starszy Geek
źródło
1
OP dotyczy serwera w chmurze, tworzenie partycji wymiany może nie być opcją. Możesz dodać Jak dodać nowy plik wymiany .
user.dz
@Sneetsher To dokładnie to, co zrobiłem, dobry komentarz
Aphire
@Sneetsher „OP dotyczy serwera w chmurze” nie był jasny (przynajmniej dla mnie) z danych w pytaniu, ale masz rację. edycja odpowiedzi.
Starszy Geek
@ElderGeek, właściwie to jest, ale nie jest dobrze podkreślone Amazon EC2 t2.micro, edytowałem pytanie, aby wyjaśnić, dodałem też tag, aby można go było łatwo połączyć z innymi powiązanymi pytaniami.
user.dz
@Sneetsher Widzę to teraz. Dziękuję za Twój wysiłek!
Starszy Geek
5

Problem w pytaniu został rozwiązany przez dodanie odpowiedniej wymiany. Dla kompletności pozwólcie, że przedstawię podsumowanie dodatkowych opcji, które mamy podczas uruchamiania Image Magick convertna dużych plikach w systemach z małą ilością pamięci lub gdy nie jest dostępna zamiana, lub zamiana była zbyt mała.

Metody wymienione poniżej zostały szczegółowo omówione w podręczniku Image Magick:

Naprawdę ogromne przetwarzanie obrazu


Streszczenie:

  1. Ogranicz użycie pamięci za pomocą opcji -limit

    W ten sposób Image Magick utworzy plik tymczasowy do obsługi obrazów, gdy tylko przekroczone zostaną określone limity pamięci. To wymaga pozwolenia na zapis dla Image Magick w tymczasowym katalogu plików. Możemy podać dowolną ścieżkę, w której plik tymczasowy zostanie utworzony w zmiennej środowiskowej MAGICK_TMPDIR. Przykładowe polecenie może wyglądać podobnie do tego:

        env MAGICK_TMPDIR=/tempdir nice -5 convert -limit memory 32 -limit map 32 largefile.jpg -resize 640x320 smallfile.png
    

    Praca na dysku zamiast w pamięci RAM znacznie spowolni szybkość przetwarzania.

  2. Praca z „plikami dysków zmapowanych w pamięci”

    Tworzenie plików MPC wymaga dużych zasobów, ale nie wymaga tak dużej ilości zasobów do konwersji z plików MPC. Dlatego można wziąć to pod uwagę w przypadku, gdy będziemy musieli kilkakrotnie przekonwertować to samo źródło o różnych parametrach. Przepływ pracy może być podobny do tego:

    convert huge.jpg huge.mpc
    convert huge.mpc -resize 50% big.png
    convert huge.mpc -resize 20% small.png
    convert huge.mpc -resize 5% thumb.png
    
  3. Pracuj na małych odcinkach obrazu za pomocą stream

    Korzystanie z oświadczeń strumieniowych do przetwarzania tylko części obrazu źródłowego bez konieczności ładowania całego obrazu do pamięci.

    stream -map rgb -storage-type char -extract 600x400+1900+2900 image.png - | convert -depth 8 -size 600x400 rgb:- tile.png
    

    W powyższym przykładzie -extractopcja przyjmuje wartości rozmiaru i przesunięcia zdefiniowane przez geometrię Magii obrazu . Będziemy musieli skleić płytki z powrotem, aby uzyskać skalowany obraz jako całość. Niestety strumień nie działa dla wszystkich formatów obrazów, ale powinien działać dobrze na obrazach JPEG.

Takkat
źródło