जाग स्मृति रिसाव?


11

इस आधार पर मैं कमांड चला रहा हूं

< /dev/urandom hexdump -v -e '/1 "%u\n"' |
awk '{ split("0,2,4,5,7,9,11,12",a,",");
       for (i = 0; i < 1; i+= 0.0001)
         printf("%08X\n", 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i)) }' |
xxd -r -p |
sox -traw -r44100 -b16 -e unsigned-integer - -tcoreaudio

मुझे लगता है कि यह कमांड चलने के दौरान awk द्वारा उपयोग की जाने वाली मेमोरी लगातार बढ़ती है, उदाहरण के लिए 75MB कच्चे ऑडियो डेटा द्वारा 500MB से अधिक मेमोरी का उपभोग किया गया है। पाइपलाइन में अन्य सभी कमांड मेमोरी की निरंतर मात्रा बनाए रखते हैं।

इस मेमोरी का उपयोग करके awk क्या है और क्या कोई विकल्प है जो केवल निरंतर मात्रा में मेमोरी का उपयोग करके इच्छित स्ट्रीम प्रोसेसिंग करता है?


अजीब संस्करण के मामले में:

 awk --version
awk version 20070501

यहां मैंने थॉमस डिके के उत्तर पर आधारित कमांड का परीक्षण किया है:

< /dev/urandom hexdump -v -e '/1 "%u\n"' |
awk 'BEGIN { split("0,2,4,5,7,9,11,12",a,",") }
           { for (i = 0; i < 1; i+= 0.0001)
               printf("%08X\n", 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i)) }' |
xxd -r -p |
sox -traw -r44100 -b16 -e unsigned-integer - -tcoreaudio

मैं अपने बीएसडी-डार्विन (मैक) सिस्टम पर मेमोरी लीक भी देखता हूं।
ओथियस

आपने कहा Here's the command I tested...लेकिन आप हमें उस परीक्षण का परिणाम बताना भूल गए - क्या इससे समस्या हल हुई या नहीं? ऐसा नहीं हो सकता है क्योंकि a[]लूप में एक तत्व के हर संदर्भ में प्रविष्टियों का निर्माण होगा यदि वे मौजूद नहीं थे यदि ऐसा नहीं होता है - तो क्या यह मदद करता है यदि आप विभाजन से पहले या उपयोग करने के बाद स्पष्ट रूप से सरणी को हटा दें, जैसे awk '{ delete a; split("0,2,4,5,7,9,11,12",a,","); for (i = 0; i < 1; i+= 0.0001) printf("%08X\n", 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i)) }'? उस कोड सेगमेंट के साथ आपको मूल स्थान में विभाजन () छोड़ने की आवश्यकता है, इसे BEGIN में न ले जाएं।
एड मॉर्टन

जवाबों:


11

यह कथन अजीब है:

split("0,2,4,5,7,9,11,12",a,",");

यह एक सरणी बनाने के लिए लगातार स्ट्रिंग को दोहराता है a। यदि आप इसे एक BEGINखंड में स्थानांतरित करते हैं , तो प्रोग्राम को एक ही काम करना चाहिए - aप्रत्येक इनपुट-रिकॉर्ड के लिए सरणी की एक नई प्रतिलिपि आवंटित किए बिना ।

टिप्पणियों को संबोधित करना: फॉर-लूप और अभिव्यक्ति सरल तरीके से मेमोरी आवंटित नहीं करते हैं। Mawk, gawk और awk की त्वरित तुलना से पता चलता है कि पहले दो के साथ कोई समस्या नहीं है, लेकिन /usr/bin/awkOSX में तेजी से रिसाव होता है। यदि Apple में बग-रिपोर्टिंग सिस्टम था, तो वह जाने का स्थान होगा।


1
जैसा आपने मेरे मैक पर सुझाव दिया था (मैं ओपी नहीं हूं)। मैं अभी भी awk के साथ एक स्मृति रिसाव देखता हूं।
ओथियस

किसी भी तरह, बस संदर्भित एक हैश का उपयोग करता है स्मृति।
ओथियस

मुझे भी; मैं अभी भी मेमोरी ग्रोथ देखता हूं। मैंने भी तुलनात्मक रूप से तुलना की और स्मृति उपयोग इस परिवर्तन के साथ उसी दर से बढ़ रहा है।
bames53

यहां तक ​​कि यह एक स्मृति रिसाव का कारण बन जाएगा:awk 'BEGIN { split("0,2,4,5,7,9,11,12",a,","); } { for (i = 0; i < 1; i+= 0.0001) a[1]; }'
ओथियस

आप mawk या gawk पर जा सकते हैं। Apple के बेस सिस्टम में कुछ वास्तविक प्राचीन वस्तुएँ शामिल हैं।
थॉमस डिकी

5

यहाँ एक पर्ल समतुल्य है जो रिसाव नहीं करता है:

perl -lne 'BEGIN { @a=(0,2,4,5,7,9,11,12);}
   for ($i = 0; $i < 1; $i+= 0.0001) {
     printf("%08X\n", 100*sin(1382*exp($a[$F[0] % 8]/12)*log(2))*$i) }'

यह लगभग समान है। $1द्वारा बदल दिया जाता है $F[0]और iउसके साथ बदल दिया जाता है $i। हैश a, एक वास्तविक सरणी साथ बदल दिया है @a

आप कुछ इनपुट उत्पन्न करने और दोनों के बीच आउटपुट और नोट अंतर की तुलना करने में बुद्धिमान होंगे। अक्सर व्याख्या की जाती है कि फ्लोटिंग पॉइंट के साथ व्याख्यात्मक भाषा कैसे व्यवहार करती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.