ImageMagick przekonwertować i niskiej pamięci RAM

11

Rozważ następujące polecenie pakietu imagemagick:

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

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

Nie jest zgłaszany błąd, a jednak nie jest tworzony test2.jpg . Przetestowałem to na mniejszych obrazkach i działa dobrze. Myślałbym, że 1G, jeśli pamięć będzie dużo, aby zarządzać zmianą rozmiaru, ale może nie?

Jakie są moje opcje, czy muszę zdobyć więcej pamięci, czy też czegoś brakuje?

Wszelkie sugestie są bardzo mile widziane!

Żądane zmiany

wyjście strace pokazuje: +++ killed by SIGKILL +++ wraz z alot poleceniami, które wyglądają normalnie (otwieranie /usr/share/local i czytanie długich łańcuchów, które, jak zakładam, to dane obrazu)

darmowy 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 na to, że swap nie jest włączony, więc zajrzę do tworzenia pliku wymiany, aby sprawdzić, czy to rozwiązuje moje problemy.

Plik daje mi:

testprint10Mbv2.jpg: JPEG image data, EXIF standard

Wkleiłabym również pełną ścieżkę / do / img, ale niestety zawiera ona poufne dane (adresy e-mail klientów itp.)

    
zadawane Aphire 22.01.2016, 17:57
źródło

2 odpowiedzi

7

Zakładam, że kończy Ci się pamięć RAM. Możesz to zweryfikować za pomocą watch cat /proc/meminfo , podczas gdy twój proces jest uruchomiony.

Być może masz za mało pamięci RAM i / lub SWAP, aby wykonać swoje zadanie.

Z powodu stanu niskiego ciśnienia, upewnij się, że swap jest włączony z swapon -a i jeśli nie ma wymiany w systemie, utwórz partycję do zamiany na nieużywanym obszarze dysku i włącz ją. Prawdopodobnie rozwiąże to problem. Jest dobra odpowiedź od @Takkat na to, jak to zrobić tutaj Jeśli nie masz dostępu do partycjonowania serwera, możesz również użyć plik wymiany dla wymiany

    
odpowiedział Elder Geek 26.01.2016, 20:08
źródło
4

Problem w pytaniu został rozwiązany przez dodanie odpowiedniej wymiany. Aby uzyskać kompletność, proszę podać podsumowanie dodatkowych opcji, jakie mamy przy uruchamianiu Image Magick convert na dużych plikach w systemach z niską pamięcią, lub gdy nie ma dostępnej swap lub zamiana była zbyt mała.

Wymienione poniżej metody są szczegółowo opisane w podręczniku Image Magick:

Naprawdę masowe przetwarzanie obrazów

Podsumowanie

:

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

    W ten sposób Image Magick utworzy tymczasowy plik do obsługi obrazów, gdy tylko przekroczone zostaną określone limity pamięci. To wymaga uprawnień do zapisu 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 proces przetwarzania.

  2. Praca z "plikami mapowanymi z pamięcią"

    Tworzenie plików MPC wymaga dużych zasobów, ale nie wymaga tak dużych zasobów do konwersji z plików MPC. Dlatego może być brany pod uwagę na wypadek, gdybyśmy musieli kilka razy konwertować to samo źródło o różnych parametrach. Przepływ pracy może być podobny do następującego:

    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. Praca nad małymi sekcjami obrazu przy użyciu stream

    Korzystanie ze strumienia twierdzi, że przetwarza tylko część obrazu źródłowego bez konieczności wczytywania 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 opcja -extract przyjmuje wartości rozmiaru i przesunięcia zdefiniowane przez Image Magick geometria . Będziemy musieli przykleić płytki, aby uzyskać skalowany obraz jako całość. Niestety strumień nie działa dla wszystkich formatów graficznych, ale powinien działać poprawnie na obrazach JPEG.

odpowiedział Takkat 28.01.2016, 19:54
źródło

Przeczytaj inne pytania na temat tagów