एक एकल तालिका के साथ एक MySQL डेटाबेस बनाएं जिसमें एक एकल फ़ील्ड है। फिर अपनी फ़ाइल को डेटाबेस में आयात करें। इससे एक निश्चित रेखा को देखना बहुत आसान हो जाएगा।
मुझे नहीं लगता कि कुछ और तेजी से हो सकता है (यदि head
और tail
पहले से ही विफल हो)। अंत में, एप्लिकेशन जो लाइन ढूंढना चाहता है n
उसे पूरी फाइल के माध्यम से तलाश करना पड़ता है जब तक कि n
नई सुचना नहीं मिल जाती । कुछ प्रकार के लुकअप (लाइन-इंडेक्स को बाइट ऑफ़सेट इन फाइल) के बिना कोई बेहतर प्रदर्शन हासिल नहीं किया जा सकता है।
यह देखते हुए कि MySQL डेटाबेस बनाना और उसमें डेटा आयात करना कितना आसान है, मुझे लगता है कि यह एक व्यवहार्य दृष्टिकोण है।
यहां है कि इसे कैसे करना है:
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);
इसका एक और बड़ा फायदा यह है कि यदि आप बाद में लाइनों के दूसरे सेट को निकालने का निर्णय लेते हैं, तो आपको फिर से प्रसंस्करण के लिए घंटों इंतजार नहीं करना होगा (जब तक कि आप निश्चित रूप से डेटाबेस को हटा नहीं देते)।