जब सीपीयू नहीं चल रहा है तो grep क्या करता है?


19

जब माचिस की तलाश करते हैं grep, तो मैं अक्सर ध्यान देता हूं कि बाद की खोज पहले की तुलना में काफी कम समय लेती है - उदाहरण 25s बनाम 2s। जाहिर है, यह अपने पिछले रन से डेटा संरचनाओं का पुन: उपयोग नहीं कर रहा है - जिन्हें निपटाया जाना चाहिए था। एक timeआदेश पर grep, मैंने एक दिलचस्प घटना देखी:

real    24m36.561s
user    1m20.080s
sys     0m7.230s

बाकी समय कहाँ जाता है? क्या ऐसा कुछ है जो मैं इसे हर बार तेजी से चलाने के लिए कर सकता हूं? (उदाहरण के लिए, फ़ाइलों को पढ़ने से पहले एक और प्रक्रिया होती grepहै।)

जवाबों:


34

यह काफी बार कैश पेज से संबंधित है ।

पहली बार, डेटा को डिस्क से (शारीरिक रूप से) पढ़ा जाना है।

दूसरी बार (बड़ी फ़ाइलों के लिए नहीं) यह पेज कैश में बैठे होने की संभावना है।

तो आप पहली बार बिल्ली (1) की तरह एक आदेश जारी कर सकते हैं (कैश में बहुत बड़ी) फ़ाइल को कैश में (यानी RAM में) लाने के लिए, फिर दूसरा grep (1) (या फ़ाइल को पढ़ने वाला कोई भी प्रोग्राम) आम ​​तौर पर तेजी से चलेगा ।

(हालांकि, डेटा को अभी भी कुछ समय डिस्क से पढ़ने की आवश्यकता है)

भी (कभी कभी अपने आवेदन कार्यक्रमों में उपयोगी है, लेकिन व्यावहारिक रूप से शायद ही कभी) देखें Readahead (2) और posix_fadvise (2) और शायद madvise (2) और सिंक (2) और fsync (2) आदि ....

LinuxAteMyRAM को भी पढ़ें ।

BTW, यही कारण है कि यह सिफारिश की जाती है, जब किसी प्रोग्राम को बेंचमार्क करना, इसे कई बार चलाना। इसके अलावा, यही कारण है कि यह अधिक रैम खरीदने के लिए उपयोगी हो सकता है (भले ही आप अपने डेटा के लिए यह सब का उपयोग करके प्रोग्राम न चलाएं)।

यदि आप अधिक समझना चाहते हैं, तो कुछ किताबों को पढ़ें जैसे कि ऑपरेटिंग सिस्टम: तीन आसान टुकड़े


12
तो, TL;DRउत्तर है "[I / O के लिए प्रतीक्षा कर रहा है ब्लॉक"।
मर्गिसिसा जूल

10
@PaDDraper वास्तव में नहीं है :) cat+ grepअभी भी grepअकेले से अधिक समय लेने वाला है ।
chepner

3
@chepner जब तक आप ब्याज के catलिए प्रस्तुत करने के दौरान कुछ और कर रहे हैं, तब तक आप एक सस्ते प्री- भ्रूण के रूप में मल्टीथ्रेड और उपयोग कर सकते हैं grep
hBy2Py


3
@ जी-मैन: आप catएस में से tacदो को एक ही प्रभाव और उच्च रैम उपयोग के लिए भी बदल सकते हैं : डी या टैक के साथ बिल्लियों के सभी
मार्क के कोवन

-1

नेटवर्क संग्रहण वातावरण में, जब आप पहली बार किसी फ़ाइल को एक्सेस करते हैं, जो सर्वर से अलग "फाइलर" पर पहुँचती है, तो अपेक्षाकृत महत्वपूर्ण देरी भी हो सकती है। एक बार उस फ़ाइल को सर्वर पर एक्सेस कर दिया गया, तो इसे स्थानीय रूप से कैश किया जाएगा और बाद में डेटा तक पहुंच बहुत तेज होगी।

यहाँ एक प्रयोग सिर्फ फ़ाइल डेटा का एक चेकसम कंप्यूटिंग है - grep नहीं। पहला आह्वान धीमा है, और बाद में तेजी से होता है।

> du -Dh file_348m
348M    file_348m

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.60user 0.15system 0:03.02elapsed 25%CPU (0avgtext+0avgdata 1524maxresident)k
708144inputs+0outputs (0major+80minor)pagefaults 0swaps

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.67user 0.06system 0:00.73elapsed 99%CPU (0avgtext+0avgdata 1524maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.65user 0.07system 0:00.73elapsed 99%CPU (0avgtext+0avgdata 1524maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.66user 0.06system 0:00.73elapsed 99%CPU (0avgtext+0avgdata 1524maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps

मैं downvote (ओं) के लिए टिप्पणियों की सराहना करता हूं, क्योंकि मुझे नहीं पता कि उन्हें कैसे व्याख्या करना है। मेरा मानना ​​है कि मेरा उत्तर विवरण सही है। शायद कमांड उदाहरण स्पष्ट नहीं है? या आपको यह पसंद नहीं है कि मैंने grep कमांड को बेंचमार्क नहीं किया? (मैंने जानबूझकर अपनी बात समझाने की कोशिश करने के लिए एक सरल कमांड, md5sum का इस्तेमाल किया।)
विंस्टन स्मिथ

1
मुझे लगता है कि इसका कारण यह है कि आपके पोस्ट ने मेरे द्वारा पूछी गई किसी भी नई जानकारी को प्रासंगिक नहीं जोड़ा। मुझे पहले से ही पता था कि देरी हो रही है, और पहले जवाब ने पहले ही स्पष्टीकरण दे दिया कि ऐसा क्यों हो रहा है। लेकिन हाँ, मैं स्पष्टीकरण के बिना भी नीचे उतरता हूं। अच्छे उत्तर वाले प्रश्नों पर भी।
एलेक्स

धन्यवाद @Alex एक कारण का सुझाव देने के लिए। मैं स्थानीय संग्रहण से डेटा को मेमोरी में स्थानांतरित करने के लिए ओवरहेड समय के बीच अंतर करने की कोशिश कर रहा था, जो कि पहले उत्तर में वर्णित है, और नेटवर्क स्टोरेज से स्थानीय सर्वर पर डेटा स्थानांतरित करने के लिए ओवरहेड समय। मैं सोचूंगा कि क्या मैं इसका अधिक स्पष्ट रूप से वर्णन कर सकता हूं या बेहतर कमांड उदाहरण प्रदान कर सकता हूं।
विंस्टन स्मिथ

मुझे लगता है कि आपके पोस्ट को पढ़ने के बाद, मेरा विचार है, यह अभी भी जहाँ भी यह संग्रहीत है, स्मृति से डेटा स्थानांतरित करने का ओवरहेड है। चाहे वह नेटवर्क स्टोरेज से हो, या लोकल स्टोरेज से, कोई फर्क नहीं पड़ता- यूनिक्स अभी भी इसे एक डायरेक्टरी से मेमोरी में मूव करने के रूप में देखता है। पीएस-- ऐसा लगता है कि मेरी व्याख्या सही है- कारण के साथ मेरी टिप्पणी को उभार मिला।
एलेक्स

मैं देख रहा हूं, मैं एक अंतर जोड़ रहा था जो आपके लिए देख रहे थे वह महत्वपूर्ण नहीं है। ठीक। वैसे, मैंने आपकी टिप्पणी को रद्द कर दिया है, इसलिए यह डाउनवोटिंग कारण के सवाल को हल नहीं करता है। :-)
विंस्टन स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.