আমার 25GB টেক্সট ফাইল রয়েছে যা কেবল কয়েকটি লাইনে স্ট্রিং প্রতিস্থাপন করা দরকার। আমি sed
সফলভাবে ব্যবহার করতে পারি তবে এটি চালাতে সত্যই দীর্ঘ সময় লাগে।
sed -i 's|old text|new text|g' gigantic_file.sql
এটি করার কি আরও দ্রুত উপায় আছে?
আমার 25GB টেক্সট ফাইল রয়েছে যা কেবল কয়েকটি লাইনে স্ট্রিং প্রতিস্থাপন করা দরকার। আমি sed
সফলভাবে ব্যবহার করতে পারি তবে এটি চালাতে সত্যই দীর্ঘ সময় লাগে।
sed -i 's|old text|new text|g' gigantic_file.sql
এটি করার কি আরও দ্রুত উপায় আছে?
উত্তর:
আপনি চেষ্টা করতে পারেন:
sed -i '/old text/ s//new text/g' gigantic_file.sql
এই রেফ থেকে :
গতির জন্য অপ্টিমাইজিং: যদি মৃত্যুদণ্ডের গতি বাড়ানোর প্রয়োজন হয় (বড় ইনপুট ফাইল বা ধীর প্রসেসর বা হার্ড ডিস্কের কারণে), "এস /... /" দেওয়ার আগে "ফাইন্ড" এক্সপ্রেশনটি নির্দিষ্ট করা থাকলে প্রতিস্থাপন আরও দ্রুত কার্যকর করা হবে। ../" নির্দেশ.
এখানে একটি 10 জি ফাইলের তুলনা করা হচ্ছে। আগে:
$ time sed -i 's/original/ketan/g' wiki10gb
real 5m14.823s
user 1m42.732s
sys 1m51.123s
পরে:
$ time sed -i '/ketan/ s//original/g' wiki10gb
real 4m33.141s
user 1m20.940s
sys 1m44.451s
sed
ভুল বানানযুক্ত। গতকাল আমি এই পোস্টে সম্পাদিত গত ঠিক করতে sed
কমান্ড যা হওয়া উচিত time sed -i '/original/ s//ketan/g' wiki10gb
এবং time sed -i '/ketan/ s//original/g' wiki10gb
। আমি আজ আমার সম্পাদনাটি উল্টিয়ে দিচ্ছি কারণ ১ বার আর কমান্ডের সাথে মেলে না এবং ২. আমি জিএনইউ সেডের সাথে একই সাথে একটি 3+ জিবি ফাইল দিয়েছি এবং আমি দুটি sed
বিকল্পের মধ্যে কোনও পার্থক্য লক্ষ্য করি না । আমি সন্দেহ করি যে সময়ের মধ্যে পার্থক্য ভুল বানানের কারণে।
time
ব্যক্তিগতভাবে ফলাফলগুলিতে প্রচুর ওঠানামা দেখেছি , তবে সব মিলিয়ে সময়ের কোনও পার্থক্য ছিল না।
সংক্ষিপ্ত উত্তরটি "না" - এই ধরণের ক্রিয়াকলাপে আপনার সীমিত ফ্যাক্টরটি হ'ল ডিস্ক আইও। 25 গিগাবাইট ডিস্কের আর কোনও দ্রুত স্ট্রিম করার উপায় নেই। আপনি যদি এডিট সম্পাদন না করে থাকেন তবে আপনি একটি সামান্য উন্নতি পেতে পারেন এবং আপনি ফলাফলটি sed
পৃথক ড্রাইভে লিখেন (যদি আপনার কাছে একটি উপলভ্য থাকে) - কারণ এইভাবে আপনি একের কাছ থেকে পড়তে পারবেন অন্যদিকে লেখার সময় এবং সামান্য কিছু আছে ফলস্বরূপ কম বিতর্ক।
আপনি প্রতিটি লাইনের জন্য রেজেক্স ইঞ্জিন ব্যবহার না করে কিছুটা গতি অর্জন করতে সক্ষম হতে পারেন - সুতরাং উদাহরণস্বরূপ পার্ল ব্যবহার করে (আমি নিশ্চিত যে আপনি এটি দিয়ে করতে পারেন sed
তবে আমি সিনট্যাক্সটি জানেন না) - এটি থেকে শুরু হবে 10,000 লাইন পরে।
perl -pe '$. > 10_000 && s/old_text/new_text/g'
আর আরઇ (মেটাচার্যাক্টর) এর মধ্যে যদি কোনও ধরণের জটিলতা থাকে তবে সেগুলি হ্রাস করে রিজেক্স ইঞ্জিনটির দক্ষতা কিছুটা বাড়িয়ে তুলবে ।
sed -i '10000,$ s/old_text/new_text/g'
sed
তুলনা করা যায় তা আমি জানি না - আমি সামান্য দ্রুত ধরে নিই, তবে ফাইল আকারের কারণে খুব বেশি নয়।
sed
মধ্যে perl
কিন্তু আধুনিক এছাড়াও আপনি খুব স্ক্রিপ্ট বাগাড়ম্বরপূর্ণ আরো লিখুন দেয়।
নতুন এবং পুরাতন পাঠ্যগুলি যদি একই দৈর্ঘ্য হয় তবে আপনি ফাইলটি সন্ধান করতে পারেন এবং পুরো ফাইলটি অনুলিপি না করে কেবল পরিবর্তিত বাইটগুলি লিখতে পারেন। অন্যথায় আপনি প্রচুর ডেটা চলতে আটকা পড়েছেন।
দ্রষ্টব্য: এটি কৌশলযুক্ত এবং কাস্টম কোড লেখার সাথে জড়িত।
যদি আপনি সি বা সি ++ এ কাজ করছেন বা সিস্টেম কলগুলি অনুসন্ধান ও লেখার জন্য আপনার পছন্দসই ভাষা র্যাপারগুলিতে সন্ধান করছেন তবে মনের পৃষ্ঠাটি সন্ধান করুন।
আপনি যদি কেবল কমান্ড লাইনটি ব্যবহার করার জন্য জোর দিয়ে থাকেন এবং আপনি পাঠ্যের বাইট অফসেট পেতে পারেন তবে সাবধানতার সাথে লিখিত "dd" কমান্ডের সাহায্যে প্রতিস্থাপন পাঠ্যটি লিখতে পারেন।