ডব্লিউসি এত ধীর কেন?


17

ডাব্লুসি ইউটিলিটি এত ধীর কেন?

আমি যখন এটি একটি বড় ফাইলে চালিত করি তখন এমডি 5সামের চেয়ে 20 গুণ বেশি সময় লাগে:

MyDesktop:/tmp$ dd if=/dev/zero bs=1024k count=1024 of=/tmp/bigfile
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.687094 s, 1.6 GB/s

MyDesktop:/tmp$ time wc /tmp/bigfile 
         0          0 1073741824 /tmp/bigfile

real    0m45.969s
user    0m45.424s
sys     0m0.424s

MyDesktop:/tmp$ time md5sum /tmp/bigfile 
cd573cfaace07e7949bc0c46028904ff  /tmp/bigfile

real    0m2.520s
user    0m2.196s
sys     0m0.316s

ফাইলটি নালাগুলিতে পরিপূর্ণ হওয়ার কারণে এটি কেবল একটি অদ্ভুত প্রান্তের শর্ত নয়, আমি ফাইলটি এলোমেলো ডেটা দ্বারা ভরাট করা বা একটি পাঠ্য ফাইল হলেও এমনকি পারফরম্যান্সে একই পার্থক্য দেখতে পাচ্ছি।

(এটি উবুন্টু ১৩.০৪, bit৪ বিট)


যারা কেবল লাইন গণনা সম্পর্কে যত্নশীল তাদের জন্য দ্রষ্টব্য: ডাব্লুসি-এল <ফাইল ফাইল> খুব বড় ফাইলগুলিতে আরও দ্রুত।
EL

উত্তর:


27

সুতরাং আমি উত্সটিতে গিয়েছিলাম এবং দেখে মনে হচ্ছে যে অলসতা ডাবল বাইট অক্ষর পরিচালনা করছে। মূলত, পড়া প্রতিটি চরিত্রের জন্য, এটিকে mbrtowc()একটি বিস্তৃত চরিত্রে রূপান্তরিত করার চেষ্টা করার জন্য কল করতে হবে, তারপরে সেই প্রশস্ত চরিত্রটি এটি কোনও শব্দের বিভাজক, লাইন বিভাজক, ইত্যাদি আছে কিনা তা পরীক্ষা করে দেখা হয় is

প্রকৃতপক্ষে, যদি আমি LANGডিফল্ট থেকে আমার স্থানীয় ভেরিয়েবলটি পরিবর্তন করি en_US.UTF-8(ইউটিএফ -8 একটি মাল্টবাইট অক্ষর সেট) এবং এটিতে " C" সেট করে রাখে (সাধারণ একক বাইট অক্ষর সেট), wcএকক বাইট অপ্টিমাইজেশান ব্যবহার করতে সক্ষম হয়, যা এটির গতি যথেষ্ট বাড়িয়ে তোলে, আগের হিসাবে প্রায় এক চতুর্থাংশ গ্রহণ।

অতিরিক্তভাবে, এটি কেবল প্রতিটি অক্ষর যদি শব্দ ( -w), লাইন দৈর্ঘ্য ( -L) বা অক্ষর ( -m) গণনা করে তবে তা পরীক্ষা করতে হবে । এটি শুধুমাত্র বাইট এবং / অথবা লাইন গন্য করছে, এটা ওয়াইড চরিত্র হ্যান্ডলিং এড়িয়ে যেতে পারেন এবং তারপর অত্যন্ত দ্রুত রান - যতো তাড়াতাড়ি md5sum

আমি এটা মাধ্যমে দৌড়ে gprof, এবং ফাংশন যে multibyte অক্ষর (হ্যান্ডেল করতে ব্যবহার করা হয় mymbsinit(), mymbrtowc(), myiswprint(), ইত্যাদি) সঞ্চালনের সময় একা 30%, এবং কোড সম্পর্কে গ্রহণ করছেন যে বাফার মাধ্যমে পদক্ষেপ আরো অনেক জটিল কারণ এটি আছে পরিবর্তনশীল আকারের অক্ষরের জন্য বাফারের মাধ্যমে পরিবর্তনশীল আকারের পদক্ষেপগুলি হ্যান্ডেল করুন পাশাপাশি বাফারের শুরুতে বাফারটিকে ছড়িয়ে দেওয়া কোনও আংশিকভাবে সম্পন্ন অক্ষরগুলি পূরণ করুন যাতে এটি পরের বারের মতো পরিচালনা করা যায়।

এখন আমি কী কী সন্ধান করতে হবে তা জানতে পেরে আমি কয়েকটি ইউটিলিটি সহ utf-8 আস্তে উল্লেখ করে কিছু পোস্ট পেয়েছি:

/programming/13913014/grepping-a-huge-file-80gb-any-way-to-speed-it-up http://dtrace.org/blogs/brendan/2011/12/08 / 2000x ক্ষমতা সম্পন্ন, জয় /


2
ওহ, ঠিক বুঝতে পেরেছি আপনি ওপি। : পি
ইভান চাউ

2
যদিও এটি সর্বাধিক উত্সাহিত উত্তর, এটি অপ্রাসঙ্গিক। md5sumআপনাকে কখনই শব্দ সংখ্যাটি গণনা করতে wcদেবে না এবং ফাইলের এমডি 5 হ্যাশ গণনা করবে না! পাঠ্য লেখার সময় আমার টাইপ রাইটারের তুলনায় আমার গাড়িটি এত ধীর কেন তা জিজ্ঞাসার মতো।
ব্যবহারকারী 49468

5
@ ব্যবহারকারী49468: উভয়ই ইনপুট ফাইলের প্রতিটি বাইট পড়তে হবে বলে ধরে নেওয়া উভয়ই আইও-আবদ্ধ ass এই উত্তরটি প্রমাণ করে যে wcবাস্তবে সিপিইউ-আবদ্ধ, যখন বহু-বাইট অক্ষর প্রক্রিয়াকরণ করা হয়।
MSalters

2
@ user49468: wc এবং md5sum বিভিন্ন জিনিস করতে পারে তবে উভয়ই ফাইল পড়ে এবং একটি তুলনামূলকভাবে সহজ গণনা করে, কেউ একটি চেকসাম গণনা করে, একটি বাইটস, শব্দ বিভাজক এবং নিউলাইনগুলিকে গণনা করে। ঠিক আছে, আমি ভেবেছিলাম এটি সহজ, তবে মাল্টিবাইট চরিত্রের সেটগুলির অতিরিক্ত জটিলতায় ফ্যাক্টর করা হয়নি। এটি জিজ্ঞাসা করার মতোই "কেন আমার গাড়ি আমার মিনিভানের চেয়ে 20 গুণ দ্রুত স্টোরে যায়?" আপনি উভয়ের মধ্যে কিছু পার্থক্য আশা করতে পারেন, তবে একটি 20 এক্স পার্থক্য নয়।
জনি

1
@ জনি আপনার গাড়ি / মিনিভান তুলনাতে সেই দিকটির অভাব রয়েছে যা উভয়ই আপনাকে দোকানে নিয়ে যাওয়ার জন্য ডিজাইন করা হয়েছে। সুতরাং একটি গতি তুলনা জায়গায় আছে। আপনার গাড়ীটি স্ট্রাইপ পেইন্টিং গাড়ির সাথে তুলনা করা আরও উপযুক্ত। কেবল উভয়ই রাস্তাগুলি ব্যবহার করার কারণে তাদের গতি প্রাসঙ্গিক নয় কারণ স্ট্রাইপ চিত্রশিল্পী কেনাকাটা এবং তদ্বিপরীত দিকে যেতে উপযুক্ত নয়।
ব্যবহারকারী 49468

1

একটি অনুমান তবে আপনি কী wcকরছেন বনাম কী করছে সে সম্পর্কে শ্রদ্ধার সাথে কমলাগুলির সাথে আপেলের তুলনা md5sumকরছেন।

md5sum এর কাজ

যখন md5sumকোনও ফাইল প্রক্রিয়া করে তখন ফাইলটি কেবল স্ট্রিম হিসাবে খোলায় এবং তারপরে MD5 চেকসাম ফাংশনটির মাধ্যমে স্ট্রিমটি চালানো শুরু করে যার খুব কম স্মৃতি দরকার। এটি মূলত সিপিইউ এবং ডিস্ক আই / ও সীমিত।

ডব্লিউসি এর কাজ

যখন wcরান হয় এটি আরও অনেক কিছু করছে তখন কেবল একবারে ফাইলকে একটি অক্ষর বিশ্লেষণ করে। এটি আসলে ফাইলের কাঠামো বিশ্লেষণ করতে হবে, অক্ষরগুলির মধ্যে সীমানা কোথায় এবং এটি কোনও শব্দের সীমানা কিনা তা নির্ধারণ করে সময়গুলি তৈরি করে lines

উদাহরণ

নীচের স্ট্রিংগুলি সম্পর্কে চিন্তা করুন এবং কীভাবে প্রতিটি অ্যালগরিদমগুলি পার্স করার সময় তাদের মধ্য দিয়ে যেতে হবে:

“Hello! Greg”
“Hello!Greg”
“Hello\nGreg”
“A.D.D.”
“Wow, how great!”
“wow     \n\n\n    great”
“it was a man-eating shark.”

এমডি 5 এর জন্য, এটি ক্ষুদ্রভাবে এই স্ট্রিংগুলির মাধ্যমে একবারে একটি চরিত্রের মধ্য দিয়ে যায়। কারণ wcএটি কোনও শব্দের ও রেখার সীমানা কী তা নির্ধারণ করতে হবে এবং এটি যে সংখ্যক ঘটনাটি দেখছে তার ট্র্যাক রাখতে হবে।

অতিরিক্ত ডব্লিউসি আলোচনা

2006 সালে এই কোডিং চ্যালেঞ্জটি পেয়েছি যা wc। নেট এ প্রয়োগের বিষয়ে আলোচনা করে । আপনি কয়েকটি সিউডো কোডের দিকে তাকানোর সাথে সাথে অসুবিধাগুলি বেশ সুস্পষ্ট, সুতরাং এটি wcঅন্যান্য ক্রিয়াকলাপের তুলনায় কেন এত ধীর বলে মনে হচ্ছে তা প্রকাশ করতে সহায়তা করতে পারে।


1
আপনি স্ট্যান্ডার্ড ইউনিক্স ডাব্লুসি কমান্ডের চেয়ে আলাদা কিছু বর্ণনা করছেন (কমপক্ষে, উবুন্টুর সাথে আসে না)। Wc-গণনা করা হয় না অনন্য শব্দ, শুধু কথার, এতোই "হ্যালো হ্যালো দুনিয়া" 3 শব্দ, 2. নয়
জনি

এই তত্ত্বের উপর ভিত্তি করে এটি একটি সরল টাস্কের মতো শোনাচ্ছে যেমন গণনা লাইনগুলি আরও দ্রুত চলে যেতে পারে। 'ডাব্লুসি' পরিবর্তন করে কোনও লাইন গণনা নির্দিষ্ট করে ফলাফল পরিবর্তন করে? 'ডাব্লুসিসিএল'
জোশুয়া মিলার

@ জোহনি - আমি কখনই বলিনি যে এটি আপনার যে অনন্য শব্দের গণনা করেছে। wcফাইলটি বিশ্লেষণের সাথে একাধিক জিনিস গণনা করে। এটি ফাইলকে বিশ্লেষণ করার সাথে সাথে শব্দের সংখ্যা, লাইন এবং বাইটগুলি গণনা করে। ম্যান পেজ পড়ুন!
slm

@ জোশুয়া মিলার - wcকেবল লাইন গণনা করা তার অভ্যন্তরীণ পার্সিংয়ের সীমাবদ্ধ করে কিনা তা অস্পষ্ট নয় যাতে এটি কেবল সমস্ত কিছু গণনা করা সত্ত্বেও কেবলমাত্র এই বিষয়গুলি গণনা করা হয় বা কেবলমাত্র লাইনের ফলাফলের প্রতিবেদন করে।
slm

@ এসএলএম আপনি বলেছেন যে এটি অনন্য শব্দের গণনা করে, আপনার উদাহরণটি বলেছে "হ্যালো! গ্রেগ ”এর ফলাফল হ্যালো 1, গ্রেগ 1 এর ফলাফল , অর্থাৎ প্রতিটি শব্দের জন্য গণনা করা হয়। এবং নেট প্রকল্পটি যার সাথে আপনি সংযুক্ত হয়েছেন এটি বলেছে "এর অন্যতম প্রধান কাজ হ'ল ডেটা সেট করে দেওয়া এবং প্রদত্ত শব্দের পুনরাবৃত্তির সংখ্যা গণনা করা। উদাহরণস্বরূপ" হ্যালো, হ্যাঁ হ্যালো "বাক্যটি আপনাকে বলবে যে হ্যালো শব্দটি দু'বার ব্যবহৃত হয়েছিল এবং হ্যাঁ শব্দটি একবার ব্যবহৃত হয়েছিল। বাস্তবে থাকার সময় প্রতিধ্বনির ফলাফল "হ্যালো, হ্যাঁ হ্যালো" | ডাব্লুসি - ওয়ার্ডস , "3", "হ্যালো: 2, হ্যাঁ: 1" নয়
জনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.