একটি পাইপলাইনে সীমাহীন পরিমাণে ডেটা বাফারের উপযোগিতা?


13

পড়ার এবং গতি লেখার ডিকপল করার জন্য আমি কোনও পাইপলাইনে আটকে থাকতে পারি কি এমন কোনও ইউটিলিটি আছে?

$ producer | buf | consumer

মূলত, আমি একটি ইউটিলিটি চাই bufযা এটির ইনপুটটি যত তাড়াতাড়ি পড়তে পারে, মেমরিতে সঞ্চয় করে রাখার ফলে এটি যত তাড়াতাড়ি দ্রুত রান consumerকরতে পারে তার মিষ্টি সময় নিতে producerপারে।


আমি
এগুলিও

stdbufটুল একটি উপস্থিত হতে পারে sizeপ্যারামিটার। আমি নিশ্চিত না এটি কাজ করে কিনা।
সিএমসিডিগ্রাগনকাই

উত্তর:


13

pv(নল ভিউয়ার) উপযোগ এই (দিয়ে কি করতে পারেন -Bআপনি রিপোর্ট অগ্রগতি দান সহ, বিকল্প) এবং আরো অনেক।


আনবাউন্ডড ডেটা দিয়ে এটি করার কোনও উপায় আছে কি? আমি যতটা বলতে পারি সেরা হিসাবে, আমাকে-বি দিয়ে একটি সংখ্যা সরবরাহ করতে হবে এবং যদি প্রযোজক গ্রাহকের তুলনায় অনেক বেশি এগিয়ে যায় তবে প্রযোজকটি আবার ধীর হয়ে যায়। আপনি যদি এমন এক পরিস্থিতিতে থাকেন যেখানে একাধিক গ্রাহক ( producer | tee >(pv -cB $SIZE | consumer1) | pv -cB $SIZE2 | consumer2) থাকে তবে এটি আবার মন্দার কারণ হতে পারে।
ড্যানিয়েল এইচ

আমি শতবার ব্যবহার করেছি pvএবং এটি কখনই জানতাম না। খুব দুর্দান্ত, ধন্যবাদ!
রুসেন্ট

pv -B 4096 -c -N in /dev/zero | pv -q -B 1000000000 | pv -B 4096 -c -N out -L 100k > /dev/null- আমি আশা করি উভয় pvপ্রান্তটি মসৃণ হবে (যদিও এটি 1 জিবি এগিয়ে রয়েছে)। এটি এইভাবে কাজ করে না, এর সাথে ভিন্নmbuffer
vi Vi

9

আপনি ব্যবহার করতে পারেন dd:

producer | dd obs=64K | consumer

এটি প্রতিটি ইউনিক্সে উপলব্ধ।


স্ট্যান্ডার্ড ইউটিলিটি ব্যবহারের জন্য +1, যদিও pvসম্ভবত এটি ব্যবহার করা সম্ভবত খুব ভাল (অগ্রগতি দেখায়)।
টোটার

2
এটি কি আসলে পড়ার এবং লেখার গতিটিকে দ্বিগুণ করে? দেখে মনে হয় যে এটি ddএকবারে কেবল একটি ব্লক সঞ্চয় করে, তাই এটি ব্লকের আকার তৈরি করতে যত সময় নেয় তার দ্বারা সমস্ত কিছু বিলম্বিত হবে; আমি ভুল হলে আমাকে সংশোধন করুন। এছাড়াও, এই বাফারিংটি কি সীমাহীন আকারে বা কেবলমাত্র ব্লকের আকারের জন্য প্রবিষ্ট করা যেতে পারে?
ড্যানিয়েল এইচ

@ ড্যানিয়েলএইচ - এটি এখন করে।
মাইকজার্ভ

7

এমবাফারটি একবার দেখুন । এটি মেমরি বা মেমরি ম্যাপ করা ফাইল ( -t/ -T) এ বাফার করতে পারে ।


আমি যেমন অন্যদের জিজ্ঞাসা করেছি, এটি প্রয়োজনীয়ভাবে বাফারকে বলার কোনও উপায় আছে, না এটির সর্বোচ্চ আকার রয়েছে? এই প্রোগ্রামগুলির বেশিরভাগের সর্বাধিক আকার রয়েছে এবং উদাহরণস্বরূপ, ছোট বাফারগুলির লিঙ্কযুক্ত তালিকা (বা অন্য কোনও স্বেচ্ছাচারিত আকারের সারি প্রয়োগকরণ) ব্যবহার করার কোনও ধারণামূলক কারণ নেই?
ড্যানিয়েল এইচ

সম্ভবত স্মৃতি ছাড়িয়ে যাওয়া ত্রুটিগুলি রোধ করতে। আপনি চাইলে খুব বড় বাফার (4 জিবি বা তাই) সেট করতে সম্ভবত একটি বিকল্প ব্যবহার করতে পারেন (চেষ্টা করে দেখুন)।
ডেভিড বালাইচ

1

এটি মূলত একটি নেতিবাচক উত্তর। এটি প্রদর্শিত হয় যে না dd, এবং না mbuffer, এমনকি pvকাজগুলিও সব ক্ষেত্রেই নয়, বিশেষত যদি নির্মাতার দ্বারা উত্পাদিত ডেটার হার অনেক আলাদা হতে পারে। আমি নীচে কিছু টেস্টকেস দেই। কমান্ডটি টাইপ করার পরে, প্রায় 10 সেকেন্ড অপেক্ষা করুন, তারপরে টাইপ করুন >(ডেটার শেষে যেতে, অর্থাত্ ইনপুটটির শেষের জন্য অপেক্ষা করুন)।

zsh -c 'echo foo0; sleep 3; \
        printf "Line %060d\n" {1..123456}; \
        echo foo1; sleep 5; \
        echo foo2' | dd bs=64K | less

এখানে, টাইপ করার পরে >, 5 সেকেন্ড অপেক্ষা করতে হবে, যার অর্থ নির্মাতারা (zsh স্ক্রিপ্ট) এর আগে অবরুদ্ধ করেছে sleep 5bs32MB বাফার যথেষ্ট পরিমাণে বড় হওয়া সত্ত্বেও 32M আকারে আকার বৃদ্ধি করা আচরণটি পরিবর্তন করে না। আমি সন্দেহ করি যে ddইনপুটটি চালিয়ে যাওয়ার পরিবর্তে আউটপুট অবরোধ করে। ব্যবহার oflag=nonblockকরা কোনও সমাধান নয় কারণ এটি ডেটা বাতিল করে।

zsh -c 'echo foo0; sleep 3; \
        printf "Line %060d\n" {1..123456}; \
        echo foo1; sleep 5; \
        echo foo2' | mbuffer -q | less

এর সাথে mbuffer, সমস্যাটি হ'ল প্রথম লাইনটি (foo0) অবিলম্বে উপস্থিত হয় না। ইনপুটটিতে লাইন-বাফারিং সক্ষম করার কোনও বিকল্প বলে মনে হচ্ছে না।

zsh -c 'echo foo0; sleep 3; \
        printf "Line %060d\n" {1..123456}; \
        echo foo1; sleep 5; \
        echo foo2' | pv -q -B 32m | less

সাথে pv, আচরণের সাথে সাদৃশ্য রয়েছে dd। সবচেয়ে খারাপ, আমি সন্দেহ করি যে এটি টার্মিনালে ভুল কাজ করে যেহেতু কখনও কখনও টার্মিনাল থেকে lessআর ইনপুট গ্রহণ করতে পারে না; উদাহরণস্বরূপ, কেউ এটি দিয়ে ছাড়তে পারে না q


0

মানহীন পদক্ষেপ: সকেট বাফার ব্যবহার করে।

উদাহরণ:

# echo 2000000000 > /proc/sys/net/core/wmem_max
$ socat -u system:'pv -c -N i /dev/zero',sndbuf=1000000000 - | pv -L 100k -c -N o > /dev/null
        i:  468MB 0:00:16 [ 129kB/s] [  <=>                        ]
        o: 1.56MB 0:00:16 [ 101kB/s] [       <=>                   ]

এই জন্য প্রয়োগ দুটি অতিরিক্ত সরঞ্জাম: buffered_pipeline এবং mapopentounixsocket

$ ./buffered_pipeline ! pv -i 10 -c -N 1 /dev/zero ! $((20*1000*1000)) ! pv -i 10 -L 100k -c -N 2 ! > /dev/zero
        1: 13.4MB 0:00:40 [ 103kB/s] [         <=>      ]
        2: 3.91MB 0:00:40 [ 100kB/s] [         <=>      ]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.