Verwendung von Python readlines () und effizientes Üben beim Lesen

Ich habe ein Problem beim Parsen von Tausenden von Textdateien (ca. 3000 Zeilen in jeder Datei mit einer Größe von ca. 400 KB) in einem Ordner. Ich habe sie mit readlines gelesen,

   for filename in os.listdir (input_dir) :
       if filename.endswith(".gz"):
          f = gzip.open(file, 'rb')
       else:
          f = open(file, 'rb')

       file_content = f.readlines()
       f.close()
   len_file = len(file_content)
   while i < len_file:
       line = file_content[i].split(delimiter) 
       ... my logic ...  
       i += 1  

Dies funktioniert einwandfrei für Beispiele aus meinen Eingaben (50.100 Dateien). Als ich mehr als 5K-Dateien mit der gesamten Eingabe bearbeitet habe, war die Zeit nicht annähernd linear. Ich hatte vor, eine Leistungsanalyse und eine C-Profil-Analyse durchzuführen. Die Zeit, die für mehr Dateien benötigt wird, nimmt exponentiell zu, wobei schlechtere Raten erreicht werden, wenn Eingaben für 7-KB-Dateien erreicht werden.

Hier ist die kumulative Zeit, die für Readlines benötigt wird, zuerst -> 354 Dateien (Beispiel aus der Eingabe) und zweitens -> 7473 Dateien (gesamte Eingabe).

 ncalls  tottime  percall  cumtime  percall filename:lineno(function)
 354    0.192    0.001    **0.192**    0.001 {method 'readlines' of 'file' objects}
 7473 1329.380    0.178  **1329.380**    0.178 {method 'readlines' of 'file' objects}

Aus diesem Grund skaliert die von meinem Code benötigte Zeit nicht linear, wenn die Eingabe zunimmt. Ich habe einige Doku-Notizen über gelesenreadlines(), wo Leute das behauptet habenreadlines() Liest den gesamten Dateiinhalt in den Speicher und verbraucht daher im Vergleich zu im Allgemeinen mehr Speicherreadline() oderread().

Ich stimme diesem Punkt zu, aber sollte der Garbage Collector den geladenen Inhalt am Ende meiner Schleife automatisch aus dem Speicher löschen, sodass mein Speicher zu jedem Zeitpunkt nur den Inhalt meiner aktuell verarbeiteten Datei enthalten sollte, richtig? Aber hier gibt es einen Haken. Kann jemand einen Einblick in dieses Thema geben.

Ist das ein inhärentes Verhalten vonreadlines() oder meine falsche Interpretation von Python Garbage Collector. Gut zu wissen.

Schlagen Sie auch einige alternative Methoden vor, um dasselbe auf speicher- und zeiteffiziente Weise zu tun. TIA.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage