একটি বিশাল ফাইলের উপরে গ্রেপিংয়ের জন্য কর্মক্ষমতা উন্নত করা হচ্ছে


10

আমার কাছে FILE_A রয়েছে যার 300,000 এর বেশি লাইন এবং FILE_B এর 30 মিলিয়নের বেশি লাইন রয়েছে আমি একটি বাশ স্ক্রিপ্ট তৈরি করেছি যা FILE_A- এ FILE_B- র প্রতিটি লাইনকে গ্রিপ করে এবং গ্রেপের ফলাফলটি একটি নতুন ফাইলে লিখি।

এই পুরো প্রক্রিয়াটি 5 ঘন্টা সময় নিচ্ছে।

আমি কীভাবে আমার স্ক্রিপ্টের পারফরম্যান্স উন্নত করতে পারি?

আমি grep -F -m 1গ্রেপ কমান্ড হিসাবে ব্যবহার করছি । FILE_A এর মতো দেখাচ্ছে:

123456789 
123455321

এবং FILE_B এর মতো:

123456789,123456789,730025400149993,
123455321,123455321,730025400126097,

বাশের সাহায্যে আমার কাছে একটি whileলুপ রয়েছে যা পরের লাইনটিকে FILE_A এ টানবে এবং এটিকে FILE_B এ চেপে ধরবে। যখন প্যাটার্নটি FILE_B এ পাওয়া যায়, আমি এটিকে ফাইল রেজাল্ট টেক্সটে লিখি।

while read -r line; do
   grep -F -m1 $line 30MFile
done < 300KFile

উত্তর:


17

ব্যবহার করার চেষ্টা করুন grep --file==FILE_A। এটি অবশ্যই নিদর্শনগুলিকে মেমোরিতে লোড করে, এর অর্থ এটি কেবল একবার FILE_B স্ক্যান করবে।

grep -F -m1 --file==300KFile 30MFile

এটি কি কেবল ধরে নিয়ে কাজ করবে যে আমার যথেষ্ট স্মৃতি আছে?
রোজারিও_মারসিও

সত্যি বলতে কী, আমি নিজেই সেই আকারের ফাইলগুলিতে চেষ্টা করে দেখিনি, তবে আমি বিশ্বাস করি এটি আপনার গতি নাটকীয়ভাবে উন্নত করা উচিত। আপনি যদি কোনও আধুনিক মেশিনে থাকেন তবে আপনার 300 ম ফাইলের স্মৃতিতে রাখা কোনও সমস্যা হবে না। (বা এই বিষয়টির জন্য 30M এক।)
রোবটটি

যখন আমি -f (--file) বিকল্পটি ব্যবহার করি এটি মূলত 30MFile পুনরায় তৈরি করে। আমি কি ভুল কিছু করছি?
রোজারিও_মারসিও

হুঁ ... সম্ভবত 300Kfile এর একটি ফাঁকা লাইন ছিল?
রোবট

ঠিক জায়গায়! ঐটা এটা ছিল! যে নিখুঁতভাবে কাজ করেছে, এটি 30 সেকেন্ডের মধ্যে শেষ হয়েছে! ধন্যবাদ!!
রোজারিও_মারসিও

2

উত্তরোত্তর জন্য একটি পার্ল উত্তর এখানে । আমি নিয়মিত 30M5 লাইনের সাথে 1 এম লাইন মেলাতে এটি করি। এটি শেষ হতে 10 সেকেন্ড সময় নেয়।

প্রথমে, হ্যাশ আপ FILE_A:

my %simple_hash;
open my $first_file, '<', 'FILE_A' or die "What have you done?! $!";
while (<$first_file>) {
  chomp;                 ## Watch out for Windows newlines
  $simple_hash{$_} = 1;  ## There may be an even faster way to define this
}
close $first_file;

তারপরে, যদি আপনার বড় ফাইলটি সীমিত করা হয় এবং কোন কলামটি পরে যেতে হবে তা জানতে, আপনি FILE_B ডাউন করার সাথে সাথে হ্যাশ কীটির অস্তিত্ব পরীক্ষা করুন , যা সাম্যতা বা নিয়মিত এক্সপ্রেশন ম্যাচের জন্য যাচাই করার চেয়ে অনেক দ্রুত:

open my $second_file, '<', 'FILE_B' or die "Oh no, not again.. $!";
while (<$second_file>) {
  my ($col1, undef) = split ',';
  if (exists($simple_hash{$col1}) {
    print $_;
  }
}
close $second_file;

যদি আপনার বৃহত্তর টার্গেট ফাইলটি সুন্দরভাবে পার্স-সক্ষম না হয়, তবে এই স্ক্রিপ্টটির মান হারাবে কারণ এর গতিটির বেশিরভাগ অংশই নিয়মিত এক্সপ্রেশন ইঞ্জিনটিকে জ্বালিয়ে না ফেলে from


1

যদি আপনি আরও কিছু জড়িত প্রোগ্রামিংকে আপত্তি না করেন তবে প্রত্যয় গাছ (বা কোনও রূপান্তর) ব্যবহার করার বিষয়টি বিবেচনা করুন ।

আপনি লিনিয়ার সময়ে ইউকোনেনের অ্যালগরিদমFILE_B ব্যবহার করে প্রিপ্রোসেস করতে পারেন । তারপরে, আপনি FILE_Aলাইন দৈর্ঘ্যে সময়রেখায় প্রতিটি লাইনটি জিজ্ঞাসা করেন এবং ফলস্বরূপ ফাইলে লিখতে পারেন এমন সমস্ত লাইন নম্বর মেলে (গাছটিকে একটি ট্যাড অভিযোজন করতে হতে পারে) মিলবে।

পুরো পদ্ধতিটি ও (এন + এনএম) সময়ে সঞ্চালিত হয় যদি n এর দৈর্ঘ্য হয় FILE_B, Nতবে লাইন সংখ্যা FILE_Aএবং এম দীর্ঘতম লাইনের দৈর্ঘ্য হয় FILE_A- এটি মূলত রৈখিক রানটাইম। চৌম্বকীয় সময়কে আপনার আসল পদ্ধতির দৈর্ঘ্যের দ্বারা প্রয়োজন হয়।


1

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

--mmap If  possible, use the mmap(2) system call to read input, instead
      of the default read(2) system call.  In some situations,  --mmap
      yields  better performance.  However, --mmap can cause undefined
      behavior (including core dumps) if an input file  shrinks  while
      grep is operating, or if an I/O error occurs.

আরও তথ্যের জন্য এটি বা এটি দেখুন mmap


আমি অবশ্যই এটিকে একটি শট দিতে যাচ্ছি এবং এটি কীভাবে হয় তা আপনাকে জানাব। আমি সম্ভবত একটি কোর ডাম্পের মুখোমুখি হব তা কতটা সম্ভব?
রোজারিও_মারসিও

@rogerio_marcio ঠিক আছে, আমি যেমন লোকটিকে বুঝতে পারি, "যদি গ্রেপ অপারেটিং চলাকালীন ফাইল সঙ্কুচিত হয় বা আই / ও ত্রুটি দেখা দেয় তবে"। সত্যিই সম্ভবত না, তবে আপনার এটি আরও ভালভাবে জানা উচিত। (যদি আমি ধরে নিই যে গ্রেপ করার সময় ফাইলটি অনুচ্চারিত হয়েছে - এটি হওয়া উচিত নয়)
রমজি কহিল

যে --mmapডোজটি কোনও কিছুই ডাম্প না করে তা পরীক্ষার জন্য , আমি এটির সাথে রান করার সুপারিশ করব --mmapএবং একটি ছাড়াই। এবং তারপরে wcআপনার একই পরিমাণ আউটপুট রয়েছে তা দেখতে ব্যবহার করুন - এটি 2 বার গ্রেপ দৌড়ে বিবেচনা করে একটি শক্ত পরীক্ষা হওয়া উচিত, এবং কেবল একটি পতাকা পৃথক হয়েছে।
রমজি কহিল

@rogerio_marcio আপনি কি এই চেষ্টা করেছেন? কোন অন্তর্দৃষ্টি?
রমজি কহিল

-1

আপনি কেন সেই ফাইলটিকে একটি ডেটাবেস ডাটাবেসে রাখেন না একটি দক্ষ সংযুক্তি, হ্যাশ, নেস্টেড লুপ এই জাতীয়ভাবে যুক্ত হয়ে আসলেই ভাল। এবং ভার্চুয়াল মেমরিটি তারা ব্যবহার করতে সত্যিই ভাল


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