Isono ~! Ich habe eine CSV-Datei, die Millionen von Datensätzen enthält. Teilen wir sie also auf und verarbeiten sie parallel!
――Ich habe nicht gesehen, dass Sie sich teilen und parallelisieren, also habe ich es als Memorandum geschrieben. Bitte sagen Sie mir, ob es einen schönen Artikel gibt --python3.7
Datei zum Lesen
sample.csv
1,Ah
2,ich
3,U.
4,e
5,Oh
Ich habe "gen_chunks ()" ausgeliehen, weil es eine Person gab, die es https://stackoverflow.com/a/4957046 gemacht hat Jemand hat die meiste Arbeit bereits erledigt. Danke Internet, danke Vorfahren Klicken Sie hier für den vollständigen Code
pool.py
import csv
import time
from multiprocessing import Pool
def read():
f = open("sample.csv", "r")
reader = csv.reader(f)
pool = Pool()
results = []
for data_list in gen_chunks(reader):
results.append(pool.apply_async(do_something, [data_list]))
pool.close()
pool.join()
_ = [r.get() for r in results]
f.close()
def do_something(data_list):
print(f"start {data_list}")
time.sleep(len(data_list))
# hoge
print(f"finish {data_list}")
def gen_chunks(reader, chunksize=2):
"""
Chunk generator. Take a CSV `reader` and yield
`chunksize` sized slices.
"""
chunk = []
for i, line in enumerate(reader):
if i % chunksize == 0 and i > 0:
yield chunk
chunk = []
chunk.append(line)
yield chunk
read()
Ergebnis
start [['1', 'Ah'], ['2', 'ich']]
start [['3', 'U.'], ['4', 'e']]
start [['5', 'Oh']]
finish [['5', 'Oh']]
finish [['1', 'Ah'], ['2', 'ich']]
finish [['3', 'U.'], ['4', 'e']]
Da chunksize = 2
, werden zwei Datensätze an do_something ()
übergeben. Wenn es sich um eine große CSV handelt, lassen Sie es sich hier gut anfühlen.
Ich erhalte einen Fehler mit _ = [r.get () für r in den Ergebnissen]
. Ich sollte den Fehler behandeln, aber ich lasse ihn weg, weil er problematisch ist
Es scheint einen besseren Weg zu geben, es zu schreiben, also lass es mich wissen, wenn du es weißt
Wie im Stackoverflow ausgeführt, lautet die Ausgabe wie folgt, wenn der Array-Reset-Teil von "gen_chunks ()" auf "del chunk [:]" gesetzt ist.
Ergebnis
start [['5', 'Oh']]
start [['5', 'Oh']]
start [['5', 'Oh']]
finish [['5', 'Oh']]
finish [['5', 'Oh']]
finish [['5', 'Oh']]
Ich habe die Kommentare nicht richtig gelesen und ein enttäuschendes Ergebnis gesehen Das ist traurig
Recommended Posts