ImageMagick dönüştürme ve düşük RAM


12

Lütfen imagemagick paketi için aşağıdaki komutu göz önünde bulundurun:

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

Şimdi test1.jpgbir olduğu oldukça geniş görüntü (12.5MB), ancak boyutları duyulmamış değil ama gelen çalışıyorum Sunucu yalnızca (bellek 1G sahip Amazon EC2 t2.micro eğer yardımcı olur)

Hiçbir hata atılamıyor ve yine test2.jpgde yaratılmıyor. Bunu daha küçük görüntülerle test ettim ve iyi çalışıyor. Bellek yeniden boyutlandırma yönetmek için bol olurdu, ama belki de değil 1G düşünürdüm?

Seçeneklerim neler, daha fazla bellek almak zorunda mıyım yoksa bir şey mi kaçırıyorum?

Herhangi bir öneri çok açıktır!

İstenen Düzenlemeler

strace çıktı gösterir: normal görünen komutların bir sürü+++ killed by SIGKILL +++ ile birlikte ( görüntü verileri olduğunu varsayalım uzun dizeleri açma ve okuma)/usr/share/local

ücretsiz bana verir:

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

Bu yüzden takas etkin değil gibi görünüyor, bu yüzden bu sorunlarımı sıralar görmek için bir takas dosyası oluşturmak için bakacağım.

Dosya bana şunu veriyor:

testprint10Mbv2.jpg: JPEG image data, EXIF standard

Ben de tam / yol / to / img yapıştırın ama ne yazık ki hassas veriler (istemci e-posta adresleri vb) içeriyor


1
Neden sudobu komutta kullanıyorsunuz ?
Charles Green


3
Ypu, piksel önbelleği için kullanılan belleği bağımsız değişkenle -limit memory 64MiBsınırlamaya çalışabilir (32MiB muhtemelen biraz fazla küçüktür. Varsayılan 1.5GiB'dir). Ve başarısız olması durumunda size bazı açıklayıcı çıktılar vermelidir.
dadexix86

2
Komutun straceönüne eklenmiş olarak komutu çalıştırmayı deneyin , hangi sistem çağrılarının yapıldığını, hataların atıldığını görün. Bize bildirin
Sergiy Kolodyazhnyy

2
Bitti. Çözmene sevindim! ücretsiz çıktı takasın kapalı olduğunu ve dosya bilgisinin yanlış tanımlanmış bir dosya olmadığını doğrular. Güzel düzenleme! +1
Elder Geek

Yanıtlar:


7

RAM'iniz bittiğini varsayıyorum. İşleminiz watch cat /proc/meminfoçalışırken bunu ile doğrulayabilirsiniz .

Görevinizi yerine getirmek için yetersiz RAM ve / veya SWAP'niz olabilir.

Düşük ram koşulu nedeniyle, takasın açık swapon -aolduğundan ve sistemde takas kurulmadığından emin olun, kullanılmayan disk alanında takas için bir bölüm oluşturun ve etkinleştirin. Bu muhtemelen sorunu çözecektir. Bunu nasıl @Takkat tarafından iyi cevap var burada sunucuyu bölümleme erişimi yoksa ayrıca bir de kullanabilirsiniz takas için swapfile


1
OP bir bulut sunucusuyla ilgilidir, takas bölümü oluşturmak bir seçenek olmayabilir. Yeni takas dosyası nasıl eklenir de ekleyebilirsiniz .
user.dz

@Sneetsher Tam olarak ne yaptım, iyi yorum
Aphire

@Sneetsher "OP bir bulut sunucusuyla ilgili" sorusundaki verilerden net değildi (en azından bana) ama iyi bir noktaya değindiniz. yanıtı düzenleme.
Yaşlı Geek

@ElderGeek, aslında öyle ama iyi vurgulanmadı Amazon EC2 t2.micro, açıklığa kavuşturmak için soruyu düzenledim, diğer ilgili sorulara kolay bağlantı sağlamak için de etiket ekledim.
user.dz

@Sneetsher şimdi görüyorum. Çabalarınız için teşekkürler!
Yaşlı Geek

5

Sorudaki sorun, uygun takas eklenerek çözüldü. Tamlık convertiçin Image Magick'i düşük bellek sistemlerinde büyük dosyalarda çalıştırırken veya kullanılabilir takas olmadığında veya takas çok küçük olduğunda ek seçeneklerin bir özetini vereyim .

Aşağıda belirtilen yöntemler Image Magick kılavuzunda ayrıntılı olarak ele alınmıştır:

Gerçekten Büyük Görüntü İşleme


Özet:

  1. Seçenek ile bellek kullanımını sınırlayın -limit

    Böyle yaparak Image Magick, verilen bellek sınırları aşılır aşılmaz görüntü işleme için geçici bir dosya oluşturur. Bunun için geçici dosya dizininde Image Magick için yazma izninin olması gerekir. Geçici dosyanın ortam değişkeninde oluşturulacağı herhangi bir yol verebiliriz MAGICK_TMPDIR. Örnek bir komut şuna benzeyebilir:

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

    RAM yerine disk üzerinde çalışmak işlem hızını önemli ölçüde yavaşlatır.

  2. "Bellek Eşlemeli Disk Dosyaları" ile çalışma

    MPC dosyaları oluşturmak kaynak gerektirir ancak MPC dosyalarından dönüştürmek için çok fazla kaynağa ihtiyaç duymaz. Bu nedenle, aynı kaynağı farklı parametrelerle birkaç kez dönüştürmemiz gerektiğinde dikkate alınabilir. Bu durumda iş akışı şuna benzer olabilir:

    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. Kullanarak görüntünün küçük bölümleri üzerinde çalışma stream

    Tüm görüntüyü belleğe yüklemeye gerek kalmadan kaynak görüntünün yalnızca bir kısmını işlemek için akış taleplerini kullanma .

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

    Yukarıdaki örnekte -extractseçenek, Image Magick geometrisi tarafından tanımlanan boyut ve ofset değerlerini alır . Ölçekli görüntüyü bir bütün olarak elde etmek için fayansları tekrar birleştirmek zorunda kalacağız. Maalesef akış tüm görüntü formatlarında çalışmaz, ancak JPEG görüntülerde iyi çalışması beklenir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.