অজম স্মৃতি ফাঁস?


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 --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)) }'? সেই কোড সেগমেন্টের সাহায্যে আপনাকে বিভাজনে () এটির মূল স্থানে ছেড়ে যাওয়া দরকার, এটিকে বিগইনে স্থানান্তরিত করবেন না।
এড মর্টন

উত্তর:


11

এই বিবৃতিটি বিজোড়:

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

এটি অ্যারে তৈরি করতে পুনরাবৃত্তভাবে একটি ধ্রুবক স্ট্রিং বিভক্ত হয় a। আপনি যদি এটি কোনও BEGINবিভাগে স্থানান্তরিত করেন তবে aপ্রতিটি ইনপুট-রেকর্ডের জন্য অ্যারের নতুন কপি বরাদ্দ না করে প্রোগ্রামটি একই কাজ করা উচিত ।

মন্তব্যগুলিকে সম্বোধন করা: লুপ এবং এক্সপ্রেশনটি সাধারণ পদ্ধতিতে মেমরির বরাদ্দ দেয় না। মাক, গাক এবং অ্যাডকের দ্রুত তুলনা দেখায় যে প্রথম দুটি নিয়ে কোনও সমস্যা নেই, তবে ওএসএক্সে /usr/bin/awkদ্রুত ফুটো হয়ে যায়। অ্যাপলের যদি বাগ-রিপোর্টিং সিস্টেম থাকে, তবে এটিই যাওয়ার জায়গা হবে।


1
আপনি আমার ম্যাকের পরামর্শ অনুযায়ী আমি তা করেছি (আমি ওপি নই)। আমি এখনও এজেড সহ একটি মেমরি ফুটো দেখতে পাচ্ছি।
ওথিয়াস

কোনওভাবে, কেবল একটি হ্যাশটিকে উল্লেখ করে মেমরি ব্যবহার করা হয়।
ওথিয়াস

একই অবস্থা; আমি এখনও স্মৃতি বৃদ্ধি দেখছি। আমিও মোটামুটি তুলনা করেছি এবং মনে হচ্ছে মেমরির ব্যবহার এই পরিবর্তনের সাথে একই হারে বাড়ছে।
bames53

এমনকি এটি মেমরি ফাঁস হতে পারে:awk 'BEGIN { split("0,2,4,5,7,9,11,12",a,","); } { for (i = 0; i < 1; i+= 0.0001) a[1]; }'
ওথিয়াস

আপনি মাক বা গোকের দিকে যেতে পারেন। অ্যাপলের বেস সিস্টেমে কিছু বাস্তব প্রাচীন জিনিস রয়েছে।
টমাস ডিকি

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,।

আপনি কিছু ইনপুট উত্পন্ন এবং আউটপুট এবং উভয় মধ্যে পার্থক্য নোট তুলনা বুদ্ধিমান হতে হবে। ব্যাখ্যামূলক ভাষাগুলি কীভাবে ভাসমান বিন্দুটির সাথে আচরণ করে সে সম্পর্কে প্রায়শই बारीকতা রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.