কোনও গতিযুক্ত ফাইলকে (80 গিগাবাইট) কোনওভাবেই গতি বাড়ানোর জন্য?


113
 grep -i -A 5 -B 5 'db_pd.Clients'  eightygigsfile.sql

এটি এক ঘন্টার জন্য বেশ শক্তিশালী লিনাক্স সার্ভারে চলছে যা অন্যথায় ওভারলোড হয় না। গ্রেপ কোন বিকল্প? আমার সিনট্যাক্স সম্পর্কে যে কোনও কিছু উন্নত করা যেতে পারে, (উদাহরণস্বরূপ, fgrep আরও ভাল?)

ফাইলটি আসলে একটি ডিরেক্টরিতে থাকে যা অন্য মাউন্টের সাথে অন্য সার্ভারের সাথে ভাগ করা হয় তবে প্রকৃত ডিস্কস্পেস স্থানীয় তাই কোনও পার্থক্য করা উচিত নয়?

গ্রেপ 93% সিপিইউ ধরে ফেলছে


8
আপনার লোকেলের উপর নির্ভর করে, -iস্যুইচটি প্রক্রিয়াটি কমিয়ে দিতে পারে, ছাড়া -iবা সাথে চেষ্টা করতে পারে LC_ALL=C grep ...। এছাড়াও, আপনি যদি কেবল একটি নির্দিষ্ট স্ট্রিংয়ের জন্য গ্রেপিং করেন তবে ব্যবহার করুন grep -F
থোর

5
@ ডগবনে যেমন এলসি_এলএল = সি ভেরিয়েবলটি fgrep ব্যবহার করে আপনার অনুসন্ধানকে ত্বরান্বিত করতে পারে উল্লেখ করেছেন আমি কিছু পরীক্ষা করেছি এবং একটি 1400% পারফরম্যান্স বৃদ্ধি অর্জন করতে সক্ষম হয়েছিলাম এবং কেন এটি আমার স্পিড আপ
গ্রেপ

আমি কৌতূহলী - কোন ফাইলটি 80 গিগাবাইট আকারের? আমি ভাবতে চাই যে কোনও ফাইল যখন বড় হয়ে যায়, সেখানে আরও ভাল স্টোরেজ কৌশল থাকতে পারে (যেমন লগ ফাইলগুলি ঘোরানো, বা বিভিন্ন ফাইল এবং ফোল্ডারগুলিতে শ্রেণিবদ্ধভাবে শ্রেণিবদ্ধকরণ)। এছাড়াও, যদি পরিবর্তনগুলি কেবল ফাইলের নির্দিষ্ট স্থানে ঘটে থাকে (যেমন শেষে) তবে কেবল পূর্ববর্তী বিভাগ থেকে কিছু গ্রেপ ফলাফল সংরক্ষণ করুন যা পরিবর্তিত হয় না এবং মূল ফাইলটি গ্রেপিংয়ের পরিবর্তে সঞ্চিত ফলাফল ফাইলটি গ্রেপ করুন।
শ্রীধর সারনোবাত

আমি github.com/google/codesearch- এ স্থির হয়েছি - ইনডেক্সিং এবং অনুসন্ধান উভয়ই বজ্রপাত ( গোয়ে লেখা) are cindex .আপনার বর্তমান ফোল্ডারটি সূচক করতে, তারপরে csearch db_pd.Clients
সিসিপিজ্জা

1
তাহলে আপনার ফাইল ইন্ডেক্স দেখেছিলেন অথবা সাজানো, এই করা সম্ভব হয়েছে অতি দ্রুত। প্রতিটি লাইনটি সংজ্ঞা অনুসারে ও (এন) অনুসন্ধান করা হয়, যেখানে একটি বাছাই করা ফাইল এটি দ্বিখণ্ডিত করে সন্ধান করা যেতে পারে - আপনি যেখানে ৮০ জিবি অনুসন্ধান করার জন্য একটি সেকেন্ডের অধীনে কথা বলছেন (অতএব কেন একটি ৮০ জিবি সূচী ডাটাবেস কোনও সময় নেয় না একটি সাধারণ নির্বাচন করুন, যেখানে আপনার গ্রেপ লাগে ... ভাল, যতক্ষণ এটি লাগে)।
চার্লস ডাফি

উত্তর:


148

এখানে কয়েকটি বিকল্প রয়েছে:

1) LC_ALL=Cইউটিএফ -8 এর পরিবর্তে সি লোকেল ব্যবহার করার জন্য আপনার গ্রেপ কমান্ডটির উপসর্গ করুন ।

২) ব্যবহার করুন fgrepকারণ আপনি একটি নিয়মিত এক্সপ্রেশন নয়, একটি নির্দিষ্ট স্ট্রিং সন্ধান করছেন।

3) -iঅপশনটি সরান , যদি আপনার এটির প্রয়োজন না হয়।

সুতরাং আপনার আদেশটি হয়ে যায়:

LC_ALL=C fgrep -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql

আপনি যদি আপনার ফাইলটি র‌্যাম ডিস্কে অনুলিপি করেন তবে এটি আরও দ্রুত হবে।


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

5
বাহ অনেক ধন্যবাদ @ ডগবনে দুর্দান্ত টিপ! এটি কেন আমাকে এলসি_এলএল = সি গ্রেপের গতি বাড়িয়েছিল তা আবিষ্কার করার জন্য একটি গবেষণা টানেলটি নামিয়েছে এবং এটি ছিল একটি অত্যন্ত আলোকিত অভিজ্ঞতা!
জ্যাকবএন

7
কিছু লোক (আমি নয়) grep -Fতার চেয়ে বেশি পছন্দ করেfgrep
ওয়াল্টার ট্রস

2
আমার বোধগম্যতা LANG=C(এর পরিবর্তে LC_ALL=C) যথেষ্ট এবং টাইপ করা সহজ।
ওয়াল্টার ট্রস

2
@ অ্যাড্রিয়ান fgrepলেখার আরেকটি উপায় grep -F, যা man fgrepআপনাকে জানাবে। এর কিছু সংস্করণ manএও বলে যে পূর্বেরটি পরবর্তীকালের জন্য অবচিত, তবে সংক্ষিপ্ত রূপটি মারা যাওয়ার পক্ষে খুব সুবিধাজনক।
ওয়াল্টার ট্রস

36

আপনার যদি কোনও মাল্টিকোর সিপিইউ থাকে তবে আমি সত্যিই জিএনইউ সমান্তরালের প্রস্তাব দেব । সমান্তরাল ব্যবহারে একটি বড় ফাইল গ্রেপ করতে:

< eightygigsfile.sql parallel --pipe grep -i -C 5 'db_pd.Clients'

আপনার ডিস্ক এবং সিপিইউগুলির উপর নির্ভর করে বৃহত্তর ব্লকগুলি পড়তে আরও দ্রুত হতে পারে:

< eightygigsfile.sql parallel --pipe --block 10M grep -i -C 5 'db_pd.Clients'

এটি আপনার প্রশ্ন থেকে সম্পূর্ণ পরিষ্কার নয়, তবে এর জন্য অন্যান্য বিকল্পগুলির grepমধ্যে রয়েছে:

  • -iপতাকা নামছে ।
  • -Fনির্দিষ্ট স্ট্রিংয়ের জন্য পতাকা ব্যবহার করা হচ্ছে
  • এর সাথে এনএলএস অক্ষম করা হচ্ছে LANG=C
  • -mপতাকা সহ সর্বোচ্চ সংখ্যক মিল নির্ধারণ করা ।

2
এটি যদি আসল ফাইল হয় তবে তার --pipepartপরিবর্তে ব্যবহার করুন --pipe। এটা অনেক দ্রুত।
ওলে টাঞ্জ

এই ব্যবহারে প্যাটার্ন সমর্থন করে না স্থানটি অন্তর্ভুক্ত করে, আমাদের এর মতো ব্যবহার প্রয়োজন: সমান্তরাল - পাইপ - ব্লক 10 এম "/ ইউএসআর / বিন / গ্রেপ-এফ-সি 5 -e 'পশুর যত্ন ও পোষা প্রাণী" "
zw963

<সমান্তরাল আদেশের পূর্ববর্তী চরিত্রটির অর্থ কী ?
elcortegano

1
@ এলকার্টেগেনো: এটাকেই I / O পুনঃনির্দেশ বলা হয় । মূলত, এটি নিম্নলিখিত ফাইলের নাম থেকে ইনপুট পড়ে। অনুরূপ cat file.sql | parallel ...তবে একটি ইউইউওসি এড়িয়ে চলে । জিএনইউ সমান্তরাল ব্যবহার করে কোনও ফাইল থেকে ইনপুট পড়ার উপায়ও রয়েছে parallel ... :::: file.sql। আছে HTH।
স্টিভ

10

কিছু তুচ্ছ উন্নতি:

  • -I বিকল্পটি সরান, যদি আপনি পারেন তবে সংবেদন সংবেদনশীলতা যথেষ্ট ধীর।

  • .দ্বারা প্রতিস্থাপন\.

    একটি একক পয়েন্ট হ'ল যে কোনও চরিত্রের সাথে মিলে যাওয়ার জন্য রেজেক্স প্রতীক, যা ধীর গতিতেও হয়


3

আক্রমণ দুটি লাইন:

  • আপনি কি নিশ্চিত, আপনার প্রয়োজন আছে -i, বা এ থেকে মুক্তি পাওয়ার কোনও সম্ভাবনা রয়েছে কি?
  • আপনার সাথে খেলতে আরও বেশি কোর আছে? grepএকক থ্রেডযুক্ত, তাই আপনি বিভিন্ন অফসেটে এগুলি আরও শুরু করতে চাইতে পারেন।

1
< eightygigsfile.sql parallel -k -j120% -n10 -m grep -F -i -C 5 'db_pd.Clients'  

আপনার যদি একাধিক স্ট্রিং সন্ধান করতে হয় তবে গ্রেপ-ফ স্ট্রিংস। টেক্সট এক টন সময় সাশ্রয় করে। উপরেরটি এমন একটি অনুবাদ যা আমি বর্তমানে পরীক্ষা করছি something -j এবং -n বিকল্প মানটি আমার ব্যবহারের ক্ষেত্রে সবচেয়ে ভাল কাজ করেছে বলে মনে হয়েছে। -এফ গ্রেপ এছাড়াও একটি বড় পার্থক্য তৈরি।

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