'হেড' বা 'লেজ' ব্যবহার করে বিশাল পাঠ্য ফাইলে - 19 গিগাবাইট


15

খুব বড় একটি টেক্সট ফাইল দেখার অংশ নিয়ে আমার সমস্যা আছে। আনুমানিক 19 জিবি এই ফাইলটি কোনও traditionalতিহ্যবাহী উপায়ে দেখতে অবশ্যই স্পষ্টতই বড়।

আমি চেষ্টা করেছি head 1এবং tail 1( head -n 1এবং tail -n 1) দু'টি কমান্ডই একসাথে বিভিন্ন উপায়ে পাইপ করেছি (মাঝখানে কোনও টুকরো পেতে) কোনও ভাগ্য ছাড়াই। উবুন্টু 9.10 চালিত আমার লিনাক্স মেশিন এই ফাইলটি প্রক্রিয়া করতে পারে না।

আমি এই ফাইলটি কীভাবে পরিচালনা করব? আমার চূড়ান্ত লক্ষ্য হ'ল 45000000 এবং 45000100 লাইনে প্রবেশ করা।


লাইনগুলি পড়ার জন্য এবং পাই ফাইল করার জন্য আমার কাছে দ্রুত পাইথন স্ক্রিপ্ট লেখার কথা ভাবছি, তবে আমি এটি দীর্ঘ সময় নিয়ে কল্পনা করতে পারি ...
নিকোরেলিয়াস

সব লাইন কি একই দৈর্ঘ্য?
পল

@ পল - দুর্ভাগ্যক্রমে, তারা একই দৈর্ঘ্য নয়।
নিকোরেলিয়াস

আপনি কাজ করতে splitআরও বড় ফাইলটিকে আরও সহজ করার চেষ্টা করতে পারেন।
iglvzx

1
ঠিক আছে. বড় আকারের কোনও ফাইলের প্রসেসিংয়ে সময় লাগবে, তাই নীচের উত্তরগুলি এতে সহায়তা করবে। আপনি যে অংশটি সন্ধান করছেন সেটিকেই যদি আপনি নিষ্কাশন করতে চান এবং আনুমানিক নির্ধারণ করতে পারেন যে এটি কোথায় আপনি নিজের ddপরে তৈরি বিটটি পেতে পারেন । উদাহরণস্বরূপ 10 dd if=bigfile of=extractfile bs=1M skip=10240 count=5জিবি পয়েন্ট থেকে শুরু করে ফাইল থেকে 5 এমবি এক্সট্রাক্ট করা হবে।
পল

উত্তর:


11

আপনার ব্যবহার করা উচিত sed

sed -n -e 45000000,45000100p -e 45000101q bigfile > savedlines

এটি sed45000000-45000100 সহ লাইনগুলি মুদ্রণ করতে এবং 45000101 লাইনে প্রস্থান করতে বলে।


1
এটি এখনও খুব ধীর, প্রায় মাথা -45000000,45000100p বিগফিলের মতো লেজ -100> সেভলাইনস
দিমিত্রি পলুশকিন

tail+|headএকটি ভাল 10-15% দ্বারা দ্রুত হয়।
এরিচ

4

একটি একক ক্ষেত্র রয়েছে এমন একটি টেবিল সহ একটি মাইএসকিউএল ডাটাবেস তৈরি করুন। তারপরে আপনার ফাইলটি ডাটাবেসে আমদানি করুন। এটি একটি নির্দিষ্ট লাইনটি দেখতে খুব সহজ করে তুলবে।

আমি মনে করি না অন্য কিছু দ্রুত হতে পারে (যদি headএবং tailইতিমধ্যে ব্যর্থ হয়)। শেষ পর্যন্ত, যে অ্যাপ্লিকেশনটি লাইনটি সন্ধান করতে চায় তাদের নতুন nফাইলগুলি না পাওয়া পর্যন্ত পুরো ফাইলটি অনুসন্ধান করতে হবে n। কোনও ধরণের অনুসন্ধান ব্যতীত (ফাইলে অফসেট বাইট করার জন্য লাইন-ইনডেক্স) এর চেয়ে ভাল পারফরম্যান্স অর্জন করা যায় না।

এটিতে একটি মাইএসকিউএল ডাটাবেস তৈরি করা এবং এতে ডেটা আমদানি করা কতটা সহজ তা বিবেচনা করে আমার মনে হয় এটি একটি কার্যকর পদ্ধতি।

কিভাবে করতে হবে এখানে আছে:

DROP DATABASE IF EXISTS helperDb;
CREATE DATABASE `helperDb`;
CREATE TABLE `helperDb`.`helperTable`( `lineIndex` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `lineContent` MEDIUMTEXT , PRIMARY KEY (`lineIndex`) );
LOAD DATA INFILE '/tmp/my_large_file' INTO TABLE helperDb.helperTable (lineContent);
SELECT lineContent FROM helperTable WHERE ( lineIndex > 45000000 AND lineIndex < 45000100 );

/tmp/my_large_file আপনি পড়তে চান ফাইল হবে।

প্রতিটি লাইনে ট্যাব-বিস্মৃত মান সহ একটি ফাইল আমদানির সঠিক বাক্য গঠন, হ'ল:

LOAD DATA INFILE '/tmp/my_large_file' INTO TABLE helperDb.helperTable FIELDS TERMINATED BY '\n' (lineContent);

এর আর একটি বড় সুবিধা হ'ল, যদি আপনি পরে লাইনগুলির অন্য সেটটি বের করার সিদ্ধান্ত নেন তবে আপনাকে আবার প্রক্রিয়াজাতকরণের জন্য কয়েক ঘন্টা অপেক্ষা করতে হবে না (যদি না আপনি অবশ্যই ডাটাবেসটি মুছবেন)।


সুতরাং এটি সত্যিই একটি ভাল সমাধান। আমি এটি sedনীচের কমান্ডটি দিয়ে কাজ করতে পেরেছি এবং আমার লাইনগুলি চিহ্নিত করেছি। তবে এখন আমার একটি ফলোআপ প্রশ্ন রয়েছে যে ডাটাবেস পদ্ধতির জন্য আরও উপযুক্ত হতে পারে। ফাইলটি থেকে এখন আমার কয়েকশ লাইন মুছতে হবে।
নিকোরেলিয়াস

আমি নিশ্চিত sedযে এটি করতে পারে। অবশ্যই, যদি আপনার ডাটাবেসে ডেটা থাকে তবে আপনার যে লাইনে চান তা দিয়ে একটি নতুন ফাইল রফতানি করা নগণ্য হবে।
ডের হচস্টাপলার

আবার ধন্যবাদ. আমি sedউত্তরটি নিয়েছি (কারণ এটি আমাকে আরও তাত্ক্ষণিক আনন্দ দিয়েছে; -) তবে আপনাকে একটি ভোট দিয়েছি কারণ ভবিষ্যতে আমি আপনার পদ্ধতিটি ব্যবহার করব। আমি এটিকে সমর্থন করি.
নিকোরেলিয়াস

1
আপনি লাইনে একটি যুক্ত FIELDS TERMINATED BY '\n'করার চেষ্টা করতে পারেন LOAD DATA
ডের হচস্টাপলার

1
আমি দুঃখিত, আমার কোডে একটি ভুল ছিল। আমি আপনার মামলার জন্য সঠিক বাক্য গঠনও যুক্ত করেছি (এবার পরীক্ষিত)।
ডের হচস্টাপলার

1

বড় ফাইলগুলির জন্য দুটি ভাল পুরাতন সরঞ্জাম joinএবং split। আপনি --lines=<number>বিকল্পের সাথে বিভক্ত ব্যবহার করতে পারেন যা নির্দিষ্ট আকারের একাধিক ফাইলগুলিতে ফাইল কেটে দেয়।

উদাহরণস্বরূপ split --lines=45000000 huge_file.txt। ফলস্বরূপ অংশগুলি এক্সএ, এক্সবি, ইত্যাদিতে থাকবে তারপরে আপনি headপার্ট এক্সবি যা আপনার পছন্দসই রেখাগুলি অন্তর্ভুক্ত করবে। আপনি একক বড় ফাইলগুলিতে ফাইলগুলিতে 'যোগদান' করতে পারেন।


দুর্দান্ত, আপনাকে ধন্যবাদ, আমি সম্পূর্ণরূপে বিভক্ত কমান্ডটি ভুলে গিয়েছিলাম।
সিলিকনরোক স্টার 21

0

আপনার কাছে সঠিক সরঞ্জাম রয়েছে তবে সেগুলি ভুলভাবে ব্যবহার করছেন। পূর্বে হিসাবে বললেন ইউ & এল এ ধরে tail -n +X file | head -n Y(নোট +) হল 10-15% তুলনায় দ্রুততর sedএক্স থেকে শুরু ওয়াই লাইন জন্য এবং সুবিধামত, আপনি স্পষ্টভাবে হবে না exitমত প্রক্রিয়া sed

লেজটি প্রথম এক্স -১ লাইনগুলি পড়বে এবং ফেলে দেবে (এর আশেপাশে কোনও উপায় নেই), তারপরে নীচের লাইনগুলি পড়ুন এবং মুদ্রণ করুন। শিরোনামটি অনুরোধ করা লাইনের সংখ্যা পড়বে এবং মুদ্রণ করবে, তারপরে প্রস্থান করবে। যখন মাথাটি প্রস্থান করে, লেজ একটি সিগপাইপ সিগন্যাল পায় এবং মারা যায়, সুতরাং এটি ইনপুট ফাইল থেকে লাইনগুলির বাফার আকারের (সাধারণত কয়েক কিলোবাইট) বেশি পড়তে পারে না।

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