यह करने का एकमात्र सही तरीका है कि यह बहुत ही सही तरीका है जो कि n बाइट्स को अंत तक एक समय में पढ़ना है जब तक कि आपके पास इच्छित लाइनों की संख्या न हो। यह अनिवार्य रूप से यूनिक्स tail
काम करता है।
IO#tail(n)
का एक उदाहरण कार्यान्वयन है, जो एक Array
के रूप में पिछले n
लाइनों रिटर्न:
class IO
TAIL_BUF_LENGTH = 1 << 16
def tail(n)
return [] if n < 1
seek -TAIL_BUF_LENGTH, SEEK_END
buf = ""
while buf.count("\n") <= n
buf = read(TAIL_BUF_LENGTH) + buf
seek 2 * -TAIL_BUF_LENGTH, SEEK_CUR
end
buf.split("\n")[-n..-1]
end
end
कार्यान्वयन एक छोटे से अनुभवहीन है, लेकिन एक त्वरित बेंचमार्क क्या एक हास्यास्पद अंतर इस सरल कार्यान्वयन पहले से ही कर सकते हैं दिखाता है (
user system total real
f.readlines[-200..-1] 7.150000 1.150000 8.300000 ( 8.297671)
f.tail(200) 0.000000 0.000000 0.000000 ( 0.000367)
बेंचमार्क कोड:
एक ~ 25 एमबी
yes > yes.txt
साथ उत्पन्न फ़ाइल) के साथ परीक्षण किया
require "benchmark"
FILE = "yes.txt"
Benchmark.bmbm do |b|
b.report "f.readlines[-200..-1]" do
File.open(FILE) do |f|
f.readlines[-200..-1]
end
end
b.report "f.tail(200)" do
File.open(FILE) do |f|
f.tail(200)
end
end
end
बेशक, other implementations पहले से मौजूद है। मैंने किसी की कोशिश नहीं की है, इसलिए मैं आपको नहीं बता सकता कि कौन सा सर्वोत्तम है।
की डुप्लिकेट:: तो मैं Molf कोड बढ़ाया [? रूबी में एक फ़ाइल के अंतिम n लाइनों पढ़ना] (http://stackoverflow.com/questions/754494) – hippietrail