খুব বড় ফাইলে দ্রুত পাঠ্য প্রতিস্থাপন করুন


25

আমার 25GB টেক্সট ফাইল রয়েছে যা কেবল কয়েকটি লাইনে স্ট্রিং প্রতিস্থাপন করা দরকার। আমি sedসফলভাবে ব্যবহার করতে পারি তবে এটি চালাতে সত্যই দীর্ঘ সময় লাগে।

sed -i 's|old text|new text|g' gigantic_file.sql

এটি করার কি আরও দ্রুত উপায় আছে?


পাঠ্যটি প্রতিস্থাপন করতে হবে এমন লাইন নম্বরগুলি কি আপনি জানেন? এটির গতি বাড়ানোর জন্য যদি আপনার একমাত্র বিকল্প না হয় তবে দ্রুত কম্পিউটার পাওয়া। আপনার প্রচুর পরিমাণে ডেটা রয়েছে তার অর্থ এটির মাধ্যমে অনুসন্ধান করতে বড় পরিমাণ সময় লাগবে।
ডেভিড কিং

আমি লাইন নম্বরগুলি খুব দ্রুত গ্রেপ করতে পারি, তাই হ্যাঁ।
আইস্যাকসন

আপনি এটির গতি বাড়ানোর জন্য একাধিক সিপিইউ কোরও
use

বড় ফাইলগুলির জন্য সেড ব্যবহার করবেন না। পরিবর্তে vi বা vim দেখুন ।
মাইকেজেআরমেসি 56

উত্তর:


26

আপনি চেষ্টা করতে পারেন:

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বিকল্পের মধ্যে কোনও পার্থক্য লক্ষ্য করি না । আমি সন্দেহ করি যে সময়ের মধ্যে পার্থক্য ভুল বানানের কারণে।
xhienne

@ xhienne আপনি ভুল বানানটির অর্থ কী তা আমি নিশ্চিত নই। প্রথম দফায় আমি 'কেটান' দিয়ে 'আসল' শব্দটি প্রতিস্থাপন করছি এবং দ্বিতীয়টিতে আমি 'কেটান' শব্দটি 'আসল' শব্দের সাথে প্রতিস্থাপন করছি, উভয় ক্ষেত্রেই সমান সংখ্যক প্রতিস্থাপনের ফলস্বরূপ।
এমকেসি

1
আমি যথেষ্ট সুনামের সাথে নয় এমন একজন নতুন ব্যবহারকারী দ্বারা রিপোর্ট করা "ফিক্স" প্রয়োগ করছি। আপনি বুঝতে পেরেছি এখন। যাইহোক, আপনি যদি প্রমাণ করতে চান যে একটি সিনট্যাক্স একে অপরের চেয়ে ভাল, আপনি ঠিক একই ক্রিয়াকলাপ করতে হবে যা এখানে নয় (সিপিইউ-ভিত্তিক, 5-চর স্ট্রিং সন্ধান করা একই নয়) 7-চর স্ট্রিং)। তদুপরি, 10 গিগাবাইট ফাইলে এই ধরণের পরীক্ষাটি আপনার মেশিন লোডের (সিপিইউ, ডিস্ক) উপর নির্ভর করে dependent আমি timeব্যক্তিগতভাবে ফলাফলগুলিতে প্রচুর ওঠানামা দেখেছি , তবে সব মিলিয়ে সময়ের কোনও পার্থক্য ছিল না।
xhienne

আমি বিশ্বাস করি এটি সম্পর্কিত - এখানে গ্রহণযোগ্য উত্তর দেখুন, স্ট্যাকওভারফ্লো / প্রশ্ন / ১১১45৫২70০/২ >> সেড পুরো ফাইলটি প্রবাহিত করে, তবে এই উত্তরে উল্লিখিত হিসাবে, লাইন নম্বরটি নির্দিষ্ট করে (যদি জানা থাকে) সহায়তা করে: আমার ক্ষেত্রে , কার্যকর করার গতিতে ~ 2-গুণ বৃদ্ধি (জিএনইউ সেড 4.5)। প্যাটার্ন অনুসন্ধানের উপর ভিত্তি করে লাইন নম্বরগুলি খুঁজতে আপনি গ্রেপ-এন বা রিপগ্রিপ (আরজি) করতে পারেন। ফলস্বরূপ, রেখা নম্বরটি নির্দিষ্ট করা উপরের উত্তর অনুসারে সেই ফাইলটিতে অনুসন্ধান ফলাফল পাওয়ার মতো।
ভিক্টোরিয়া স্টুয়ার্ট

1

সংক্ষিপ্ত উত্তরটি "না" - এই ধরণের ক্রিয়াকলাপে আপনার সীমিত ফ্যাক্টরটি হ'ল ডিস্ক আইও। 25 গিগাবাইট ডিস্কের আর কোনও দ্রুত স্ট্রিম করার উপায় নেই। আপনি যদি এডিট সম্পাদন না করে থাকেন তবে আপনি একটি সামান্য উন্নতি পেতে পারেন এবং আপনি ফলাফলটি sedপৃথক ড্রাইভে লিখেন (যদি আপনার কাছে একটি উপলভ্য থাকে) - কারণ এইভাবে আপনি একের কাছ থেকে পড়তে পারবেন অন্যদিকে লেখার সময় এবং সামান্য কিছু আছে ফলস্বরূপ কম বিতর্ক।

আপনি প্রতিটি লাইনের জন্য রেজেক্স ইঞ্জিন ব্যবহার না করে কিছুটা গতি অর্জন করতে সক্ষম হতে পারেন - সুতরাং উদাহরণস্বরূপ পার্ল ব্যবহার করে (আমি নিশ্চিত যে আপনি এটি দিয়ে করতে পারেন sedতবে আমি সিনট্যাক্সটি জানেন না) - এটি থেকে শুরু হবে 10,000 লাইন পরে।

perl -pe '$. > 10_000 && s/old_text/new_text/g' 

আর আরઇ (মেটাচার্যাক্টর) এর মধ্যে যদি কোনও ধরণের জটিলতা থাকে তবে সেগুলি হ্রাস করে রিজেক্স ইঞ্জিনটির দক্ষতা কিছুটা বাড়িয়ে তুলবে ।


1
sed -i '10000,$ s/old_text/new_text/g'
সেডে

বাহ। কীভাবে sedতুলনা করা যায় তা আমি জানি না - আমি সামান্য দ্রুত ধরে নিই, তবে ফাইল আকারের কারণে খুব বেশি নয়।
সোবারিক

আমি ধরে নিলাম পার্ল সেডের চেয়ে দ্রুত, তবে সেড কিছুটা কম ক্রিপ্টিক, বা প্রাথমিক শিক্ষার বক্ররেখার কম প্রয়োজন।
দানি_ল

1
দেখুন বিপরীত এখন আমি বলেছি চাই, - আপনি (প্রায়) লিখতে পারেন sedমধ্যে perlকিন্তু আধুনিক এছাড়াও আপনি খুব স্ক্রিপ্ট বাগাড়ম্বরপূর্ণ আরো লিখুন দেয়।
সোবারিক

0

নতুন এবং পুরাতন পাঠ্যগুলি যদি একই দৈর্ঘ্য হয় তবে আপনি ফাইলটি সন্ধান করতে পারেন এবং পুরো ফাইলটি অনুলিপি না করে কেবল পরিবর্তিত বাইটগুলি লিখতে পারেন। অন্যথায় আপনি প্রচুর ডেটা চলতে আটকা পড়েছেন।

দ্রষ্টব্য: এটি কৌশলযুক্ত এবং কাস্টম কোড লেখার সাথে জড়িত।

যদি আপনি সি বা সি ++ এ কাজ করছেন বা সিস্টেম কলগুলি অনুসন্ধান ও লেখার জন্য আপনার পছন্দসই ভাষা র‍্যাপারগুলিতে সন্ধান করছেন তবে মনের পৃষ্ঠাটি সন্ধান করুন।

আপনি যদি কেবল কমান্ড লাইনটি ব্যবহার করার জন্য জোর দিয়ে থাকেন এবং আপনি পাঠ্যের বাইট অফসেট পেতে পারেন তবে সাবধানতার সাথে লিখিত "dd" কমান্ডের সাহায্যে প্রতিস্থাপন পাঠ্যটি লিখতে পারেন।

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