Rozważ następujące polecenie dla pakietu imagemagick:
sudo convert -resize 460x200 /path/to/test1.jpg /path/to/test2.jpg
Teraz test1.jpg
jest 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.jpg
jest 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/local
i 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.)
sudo
tego polecenia?-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.strace
dołączonym przed nim poleceniem, sprawdź, jakie wywołania systemowe są wykonywane, zgłaszane błędy. Daj nam znaćOdpowiedzi:
Zakładam, że kończy Ci się pamięć RAM. Możesz to sprawdzić za pomocą,
watch cat /proc/meminfo
gdy 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 -a
i 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źródło
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.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
convert
na 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:
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:Praca na dysku zamiast w pamięci RAM znacznie spowolni szybkość przetwarzania.
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:
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.
W powyższym przykładzie
-extract
opcja 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.źródło