Problem: massive .csv -Dateien (bis zu 1 Million Zeilen, 200 Kolumnen) in Python 2.7 begleitet Speicherfehler. Diese Methode wird jedoch für große Dateien unpraktisch, da sie übermäßige Erinnerung verbraucht.
Lösung:
1. Verarbeiten Sie Zeiger, sobald sie produziert werden:
vermeiden Sie das Laden der gesamten Datei in Speicher. Verarbeiten Sie stattdessen Zeilen, sobald sie mit einer Generatorfunktion generiert werden.
def getstuff (Dateiname, Kriterium): mit offenem (Dateiname, "RB") als CSVFile: DataReader = CSV.Reader (CSVFile) Nächste Ertrag (DataReader) # Ergeben Sie die Header -Zeile Für Zeile in DataReader: Wenn Zeile [3] == Kriterium: Relief row
def getstuff(filename, criterion): with open(filename, "rb") as csvfile: datareader = csv.reader(csvfile) yield next(datareader) # yield the header row for row in datareader: if row[3] == criterion: yield row2. Verwenden Sie Generatorfunktionen zum Filtern:
Filterdaten beim Iterieren der Datei mit Generatorfunktionen filtern. Dieser Ansatz ermöglicht die Übereinstimmung mehrerer aufeinanderfolgender Zeilen, die ein bestimmtes Kriterium erfüllen.
def getstuff (Dateiname, Kriterium): mit offenem (Dateiname, "RB") als CSVFile: DataReader = CSV.Reader (CSVFile) Nächste Ertrag (DataReader) # Ergeben Sie die Header -Zeile Ergeben von Take the Take ( Lambda R: R [3] == Kriterium, DropHiny (Lambda R: R [3]! = Kriterium, DataReader)) return
def getstuff(filename, criterion): with open(filename, "rb") as csvfile: datareader = csv.reader(csvfile) yield next(datareader) # yield the header row for row in datareader: if row[3] == criterion: yield row3. Optimieren Sie den Speicherkonsum:
Refactor getData (), um auch eine Generatorfunktion zu verwenden, um sicherzustellen, dass nur eine Zeile in Erinnerung bleibt.
def getData (Dateiname, Kriterien): für Kriterien in Kriterien: Für Row in GetStuff (Dateiname, Kriterium): Rendite row
def getstuff(filename, criterion): with open(filename, "rb") as csvfile: datareader = csv.reader(csvfile) yield next(datareader) # yield the header row for row in datareader: if row[3] == criterion: yield rowZusätzliche Tipps für Geschwindigkeit:
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3