2016-08-19 5 views
1

Ich habe eine große Datei, die mehr als 1M Zeilen hat, und eine andere Datei, die die Eingabe-Strings benötigt, um die Zeilen in der großen Datei zu erhalten .Wie verarbeitet man eine große Datei in Schleife als Eingabe für eine andere Datei

konnte ich es auf diese Weise tun:

File.open(strings_file, 'r') do |l| 
    File.open(large_file, 'r') do |line| 
    next if !line.include?(l) 
    puts line 
    end 
end 

Aber, wird es die große Datei für jede Schleife öffnen. Zum Beispiel habe ich in input-Strings 100 Zeilen mit Strings. Wenn es ausgeführt wird, öffnet es diese große Datei 100 Mal, um sie zu verarbeiten, was mehr Zeit in Anspruch nimmt.

Gibt es eine viel schnellere Methode, die große Datei 100 Mal zu öffnen?

Antwort

5

Zuerst haben Sie ein geometrisches Skalierungsproblem, wenn Sie das falsch verstehen. Wenn die Eingabedatei A N Zeilen hat und B M Zeilen hat, müssen Sie N * M Tests durchführen, um nach Überlappungen zu suchen. Das kann unmöglich langsam sein.

Stattdessen in den Eingangsleitungen ziehen und klebe sie in etwas, das Sie für die schnelle Lookups verwenden können:

require 'set' 
match_lines = Set.new(File.readlines(strings_file).map(&:chomp)) 

Dann können Sie sehr schnell testen hier:

File.foreach(large_file) do |line| 
    print line if (match_lines.include?(line.chomp)) 
end 

Ich bin mit chomp Hier können Sie verhindern, dass die Übereinstimmung nicht übereinstimmt, wenn die letzte Zeile in Ihrer Abgleichdatei am Ende keinen Zeilenumbruch aufweist oder wenn Sie die CRLF-Codierung in einer und LF in der anderen verwenden.

+0

Schön! Aber es funktioniert nicht wegen Match_lines sind nur einfache Zeichenfolgen und Zeilenvariable Wert würde sowohl Sonderzeichen und Zeichenfolge enthalten. Ich denke, wir müssen das '(match_lines.include? (Line.chomp))' umgekehrt ausführen. Nicht sicher, wie man es in umgekehrter Weise macht. – Karthi1234

+0

Was meinst du mit dem "umgekehrten Weg"? Über welche Art von Inhalten sprichst du in der 'strings_file'? – tadman

+1

strings_file Inhalt: 'Test Wort Bernstein rot Blue' Larger_file Inhalte, die mit den oben genannten Saiten abgestimmt: ' 'Test, das ist t3e $ t-Datei' und 'Standort/mnt' . . blau, die Farbe ist blau und 'die ist Teil von RGB'' Hope mache jetzt klar – Karthi1234

Verwandte Themen