Heim >Backend-Entwicklung >PHP-Tutorial >So lesen Sie große Dateien mit Python

So lesen Sie große Dateien mit Python

不言
不言Original
2018-04-24 15:41:351928Durchsuche

In diesem Artikel wird hauptsächlich die Verwendung von Python zum Lesen großer Dateien vorgestellt

Hintergrund

Kürzlich Beim Verarbeiten eines Textdokuments (die Datei ist etwa 2 GB groß) trat ein Speicherfehler auf und das Lesen der Datei war zu langsam. Später habe ich zwei schnellere Methoden zum Lesen großer Dateien gefunden.

Vorbereitung

Wenn wir von „Textverarbeitung“ sprechen, meinen wir in der Regel das, was verarbeitet wird. Python macht es sehr einfach, den Inhalt einer Textdatei in eine manipulierbare String-Variable einzulesen. Dateiobjekte bieten drei „Lese“-Methoden: .read(), .readline() und .readlines(). Jede Methode kann eine Variable akzeptieren, um die Menge der jedes Mal gelesenen Daten zu begrenzen, verwendet jedoch im Allgemeinen keine Variablen. .read() liest jeweils die gesamte Datei und wird normalerweise verwendet, um den Dateiinhalt in eine Zeichenfolgenvariable einzufügen. Allerdings generiert .read() die direkteste Zeichenfolgendarstellung des Dateiinhalts, ist jedoch für eine kontinuierliche zeilenorientierte Verarbeitung nicht erforderlich und eine solche Verarbeitung ist nicht möglich, wenn die Datei größer als der verfügbare Speicher ist. Das Folgende ist ein Beispiel für die read()-Methode:

try:
f = open('/path/to/file', 'r')
print f.read()
finally:
if f:
f.close()

Der Aufruf von read() liest den gesamten Inhalt der Datei auf einmal 10G wird der Speicher explodieren. Um auf der sicheren Seite zu sein, können Sie die Methode read(size) wiederholt aufrufen und jedes Mal bis zur Größe Bytes lesen. Darüber hinaus kann der Aufruf von readline() jeweils eine Inhaltszeile lesen, und der Aufruf von readlines() kann den gesamten Inhalt auf einmal lesen und die Liste zeilenweise zurückgeben. Daher müssen Sie entsprechend Ihren Anforderungen entscheiden, wie Sie es aufrufen möchten.

Wenn die Datei sehr klein ist, ist es am bequemsten, sie einmal mit read() zu lesen; wenn die Dateigröße nicht bestimmt werden kann, ist es sicherer, read(size) wiederholt aufzurufen; Als Konfigurationsdatei ist es am bequemsten, readlines() aufzurufen:

for line in f.readlines():
process(line) #

 

Blocked reading

Bei der Verarbeitung großer Dateien kann man sich leicht vorstellen, die große Datei zur Verarbeitung in mehrere kleine Dateien aufzuteilen und diesen Teil des Speichers nach der Verarbeitung jeder kleinen Datei freizugeben. Iter und yield werden hier verwendet:

def read_in_chunks(filePath, chunk_size=1024*1024):
"""
Lazy function (generator) to read a file piece by piece.
Default chunk size: 1M
You can set your own chunk size
"""
file_object = open(filePath)
while True:
chunk_data = file_object.read(chunk_size)
if not chunk_data:
break
yield chunk_data
if __name__ == "__main__":
filePath = './path/filename'
for chunk in read_in_chunks(filePath):
process(chunk) # <do something with chunk>

Use With open()

with Anweisungen zum Öffnen und Schließen von Dateien, einschließlich des Auslösens einer inneren Blockausnahme. for line in f file object f wird als Iterator behandelt und verwendet automatisch gepufferte E/A- und Speicherverwaltung, sodass Sie sich keine Gedanken über große Dateien machen müssen.

Der Code lautet wie folgt:

#If the file is line based
with open(...) as f:
  for line in f:
    process(line) # <do something with line>

Optimierung

Bei großen Datenmengen mit Tausenden von Zeilen stellt die Verwendung von Open kein Problem dar, aber die unterschiedlichen Parameter führen auch zu unterschiedlichen Effizienzen. Nach dem Test beträgt die Effizienz, wenn der erste Parameter „rb“ ist, das Sechsfache von „r“. Es ist ersichtlich, dass das binäre Lesen immer noch der schnellste Modus ist.

with open(filename,"rb") as f: 
  for fLine in f: 
    pass

Testergebnisse: Die rb-Methode ist die schnellste und durchläuft 1 Million Zeilen in 2,9 Sekunden. Es kann grundsätzlich die Effizienzanforderungen der Verarbeitung mittlerer und großer Dateien erfüllen. Wenn das Lesen von rb (sekundäres Systemlesen) auf r (Lesemodus) geändert wird, ist es 5-6 mal langsamer.

Fazit

Wenn Sie Python zum Lesen großer Dateien verwenden, sollten Sie das System mit der einfachsten Methode „Leave“ damit umgehen lassen Geben Sie es an den Dolmetscher weiter und kümmern Sie sich einfach um Ihre eigene Arbeit. Gleichzeitig können je nach Bedarf unterschiedliche Leseparameter ausgewählt werden, um eine höhere Leistung zu erzielen.

Verwandte Empfehlungen:

Detaillierte Erklärung, wie Python Textdaten liest und in das DataFrame-Format konvertiert

Das obige ist der detaillierte Inhalt vonSo lesen Sie große Dateien mit Python. 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