Heim >Backend-Entwicklung >Python-Tutorial >Wie gehe ich mit Speicherproblemen beim Lesen großer CSV-Dateien in Python um?

Wie gehe ich mit Speicherproblemen beim Lesen großer CSV-Dateien in Python um?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-09 05:07:02455Durchsuche

How to Handle Memory Issues When Reading Large CSV Files in Python?

Lesen großer CSV-Dateien in Python

In Python 2.7 stoßen Benutzer häufig auf Speicherprobleme, wenn sie CSV-Dateien mit Millionen und Hunderten von Zeilen lesen Spalten. Dieser Artikel befasst sich mit diesen Herausforderungen und bietet Lösungen zur effektiven Verarbeitung großer CSV-Dateien.

Originalcode und Probleme

Der bereitgestellte Code zielt darauf ab, bestimmte Zeilen aus einer CSV-Datei zu lesen nach einem vorgegebenen Kriterium. Allerdings werden vor der Verarbeitung alle Zeilen in eine Liste geladen, was bei Dateien mit mehr als 300.000 Zeilen zu Speicherfehlern führt.

Lösung 1: Zeilen inkrementell verarbeiten

Um das zu beseitigen Bei Speicherproblemen ist es wichtig, Zeilen inkrementell zu verarbeiten, anstatt sie in einer Liste zu speichern. Um dies zu erreichen, kann eine Generatorfunktion verwendet werden:

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 row

Diese Funktion liefert die Kopfzeile und die nachfolgenden Zeilen, die dem Kriterium entsprechen, und stoppt dann den Lesevorgang.

Lösung 2: Optimierte Filterung

Alternativ kann eine präzisere Filtermethode verwendet werden eingesetzt:

def getstuff(filename, criterion):
    with open(filename, "rb") as csvfile:
        datareader = csv.reader(csvfile)
        yield next(datareader)  # yield the header row
        yield from takewhile(
            lambda r: r[3] == criterion,
            dropwhile(lambda r: r[3] != criterion, datareader))

Diese Methode verwendet die Funktionen takewhile und dropwhile aus dem itertools-Modul, um die Zeilen zu filtern.

Aktualisierter Code

Im getdata-Funktion wird das Listenverständnis durch einen Generator ersetzt Verständnis:

def getdata(filename, criteria):
    for criterion in criteria:
        for row in getstuff(filename, criterion):
            yield row

Fazit

Durch den Einsatz von Generatorfunktionen und der Optimierung von Filtertechniken ist es möglich, große CSV-Dateien effektiv zu verarbeiten, Speicherfehler zu vermeiden und die Leistung deutlich zu verbessern .

Das obige ist der detaillierte Inhalt vonWie gehe ich mit Speicherproblemen beim Lesen großer CSV-Dateien in Python um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn