8

मैं छवि फ़ाइलों की एक बड़ी संख्या (लगभग 5200) (पीपीएम प्रारूप, आकार में प्रत्येक 5 MB) का आकार बदलने और convert का उपयोग कर PNG प्रारूप में उन्हें बचाने के लिए करना चाहते हैं।ImageMagick: कैसे कम स्मृति के उपयोग को प्राप्त करने के छवि फ़ाइलों की एक बड़ी संख्या आकार बदलते समय?

लघु संस्करण: स्मृति के

convert चल रही है 24 जीबी हालांकि मैं वाक्य रचना कि convert बताता लगातार छवि फ़ाइलों को संसाधित करने के लिए उपयोग करें।

लांग संस्करण:

के बारे में छवि डेटा से अधिक 25 जीबी, मैं समझ मैं एक साथ सभी फ़ाइलों को प्रोसेस नहीं करना चाहिए। मैं और मैं कैसे लगातार छवि फ़ाइलों पर कार्रवाई करने के बारे में ImageMagick प्रलेखन found खोज:

यह प्रत्येक छवि का आकार बदलने के लिए तेजी से और कम संसाधन गहन है यह है पढ़ने:

$ convert '*.jpg[120x120]' thumbnail%03d.png

इसके अलावा , the tutorial states:

उदाहरण के लिए ...

montage '*.tiff' -geometry 100x100+5+5 -frame 4 index.jpg

जो पहले के सारे TIFF फ़ाइलों को पढ़ता है, फिर उन्हें आकार बदलता है। आप बजाय कर सकते हैं ...

montage '*.tiff[100x100]' -geometry 100x100+5+5 -frame 4 index.jpg

इस में प्रत्येक छवि पढ़ा जाएगा, और उन्हें आकार परिवर्तन, अगली छवि पर आगे बढ़ने से पहले। बहुत कम मेमोरी उपयोग में परिणामस्वरूप, और संभवतः डिस्क स्वैपिंग (थ्रैशिंग) को रोकें, जब स्मृति सीमाएं पहुंच जाती हैं।

$ convert '*.ppm[1280x1280]' pngs/%05d.png 

डॉक्स के अनुसार, यह एक के बाद प्रत्येक छवि फ़ाइल एक व्यवहार करना चाहिए: पढ़ें, आकार परिवर्तन, लिखने

इसलिए, यह मैं क्या कर रहा हूँ है। मैं इसे 12 असली कोर और 24 जीबी रैम वाली मशीन पर कर रहा हूं। हालांकि, पहले दो मिनट के दौरान, convert प्रक्रिया का स्मृति उपयोग लगभग 96% तक बढ़ता है। यह थोड़ी देर तक रहता है। सीपीयू उपयोग अधिकतम है। थोड़ा अधिक समय और प्रक्रिया, मर जाता है तो बस कह रही:

किल्ड

इस बिंदु पर, कोई आउटपुट फाइलों उत्पादन किया गया है। मैं उबंटू 10.04 पर हूँ और convert --version का कहना है:

Version: ImageMagick 6.5.7-8 2012-08-17 Q16 http://www.imagemagick.org 
Copyright: Copyright (C) 1999-2009 ImageMagick Studio LLC 
Features: OpenMP 

यह रूपांतरण शुरू करने से पहले सभी डेटा को पढ़ने के लिए convert की कोशिश करता तरह दिखता है। तो या तो convert में एक बग है, दस्तावेज़ीकरण के साथ एक मुद्दा या मैंने दस्तावेज़ को ठीक से नहीं पढ़ा।

क्या गलत है? इस बड़ी संख्या में छवि फ़ाइलों का आकार बदलते समय मैं कम स्मृति उपयोग कैसे प्राप्त कर सकता हूं?

बीटीडब्ल्यू: एक त्वरित समाधान केवल खोल का उपयोग कर फाइलों पर लूप होगा और convert प्रत्येक फ़ाइल के लिए स्वतंत्र रूप से आमंत्रित करेगा। लेकिन मैं समझना चाहता हूं कि शुद्ध छवि मैगिक के साथ इसे कैसे प्राप्त किया जाए।

धन्यवाद!

+1

यदि आप 'ढूंढने की कोशिश करते हैं। -नाम "* .ppm" -exec रूपांतरित करें '{} [1280x1280]' pngs /% 05d.png \; 'क्या यह काम करता है? 'find -exec' सभी फ़ाइलों को सूचीबद्ध करेगा और उनमें से प्रत्येक तर्क में दिए गए आदेश को निष्पादित करेगा। – Flinth

+0

@epingle: सिद्धांत रूप में यह काम करता है (जैसा कि मैंने अपने प्रश्न के अंतिम भाग में कहा था)। ऐसा कुछ भी करना मेरा अस्थायी समाधान है। फिर भी, इसे शुद्ध छवि मैगिक के साथ भी काम करना चाहिए (चाहिए)। (ध्यान दें कि आपका विशेष समाधान काम नहीं करेगा, क्योंकि फ़ाइल काउंटर '% 05d' हमेशा शून्य होगा)। –

+0

ठीक है, मुझे आपके संदेश का अंत नहीं दिखाई देता है या% 05d आपके लिए काउंटर था – Flinth

उत्तर

5

आपके सिस्टम तक सीधे पहुंच के बिना यह आपको डीबग करने में मदद करना वाकई मुश्किल है।

लेकिन आप तीन बातें मदद करने के लिए अपने आप को नीचे इस समस्या को सीमित कर सकते हैं:

  1. पहले कमांडलाइन तर्क क्या हो रहा है के बारे में अधिक विवरण देखने के लिए के रूप में -monitor जोड़ें।

  2. (वैकल्पिक) अस्थायी रूप से जोड़ने के -debug all -log "domain: %d +++ event: %e +++ function: %f +++ line: %l +++ module: %m +++ processID: %p +++ realCPUtime: %r +++ wallclocktime: %t +++ userCPUtime: %u \n\r"

  3. , का उपयोग नहीं करते '* .ppm [1280x1280]' एक तर्क है, लेकिन उपयोग 'एक * .ppm [1280x1280]' के बजाय के रूप में। इसका उद्देश्य सभी संभव मैचों की बजाय अपने वाइल्डकार्ड विस्तार (या इसे प्राप्त करने के लिए कुछ अन्य उपयुक्त तरीका) को सीमित करना है।

यदि आप '2.' करते हैं आपको '3.' करना होगा साथ ही अन्यथा आप आउटपुट के द्रव्यमान से अभिभूत होंगे। (इसके अलावा अपने सिस्टम वैसे भी प्रक्रिया को मारने के लिए बिना नहीं पूर्ण वाइल्डकार्ड कार्रवाई करने के लिए सक्षम होने के लिए प्रतीत होता है ...)

आप एक समाधान नहीं ढूँढ तो है ...

  1. .. the official ImageMagick bug report forum पर उपयोगकर्ता नाम पंजीकरण करें।
  2. ... यह देखने के लिए अपनी समस्या की रिपोर्ट करें कि वे आपकी मदद कर सकते हैं (यदि आप विनम्रता से पूछते हैं तो ये लोग दोस्ताना और उत्तरदायी हैं)।
2

एक ही मुद्दा मिल गया, ऐसा लगता है क्योंकि यह ImageMagick/tmp निर्देशिका है, जो अक्सर एक tmpfs के रूप में रखा जाता है में अस्थायी फ़ाइलों को पैदा करते हैं।

बस कहीं और अपने टीएमपी को स्थानांतरित करें।

उदाहरण के लिए:

  • एक बड़ा बाहरी ड्राइव

    mkdir -m777 /media/huge_device/tmp

  • यकीन है कि अनुमतियों 777

    chmod 777 /media/huge_device/tmp करने के लिए सेट कर रहे हैं पर एक "tmp" निर्देशिका बनाने

  • रूट के रूप में

    , अपने को/tmp के लिए प्रतिस्थापन में यह माउंट

    mount -o bind /media/huge_device/tmp /tmp

नोट: यह TMP वातावरण चर के साथ उपयोग करने के लिए एक ही चाल करना संभव होना चाहिए।

0

यदि आपके पास 12 कोर हैं तो मैं जीएनयू समानांतर के साथ जाऊंगा - ऐसा कुछ, जो बहुत अच्छी तरह से काम करता है। चूंकि यह एक समय में केवल 12 छवियां करता है, जबकि अभी भी आपकी आउटपुट फ़ाइल नंबरिंग को संरक्षित करता है, यह केवल न्यूनतम रैम का उपयोग करता है।

scene=0 
for f in *.ppm; do 
    echo "$f" $scene 
    ((scene++)) 
done | parallel -j 12 --colsep ' ' --eta convert {1}[1280x1280] -scene {2} pngs/%05d.png 

नोट्स

-scene आप दृश्य काउंटर, जो आपके %05d भाग में बाहर आता है सेट करने देता है।

--eta भविष्यवाणी करता है कि आपका काम कब किया जाएगा (अनुमानित आगमन समय)।

-j 12 एक समय में समानांतर में 12 नौकरियां चलाता है।

संबंधित मुद्दे