Mi chiedo quali sono i compromessi tra la lettura dei file in sequenza e in parallelo.Sequenziale o parallelo: qual è il modo corretto di leggere più file in python?
Diciamo che ho un file di milioni di megabyte che vorrei elaborare, ma non abbastanza memoria da contenere tutti in una volta. Per elaborare questi in sequenza, non posso fare:
results = [do_something(os.path.join(files, f)) for f in os.listdir(files)]
Oppure posso farlo in parallelo:
paths = [os.path.join(files, f) for f in os.listdir(files)]
p = multiprocessing.Pool()
try:
results = p.map(do_something, paths)
p.close()
p.join()
except KeyboardInterrupt:
p.terminate()
In generale sono stato ammonito contro l'esecuzione parallela di I/O perché la lettura del disco è abbastanza casuale lento. Ma in questo caso è parallela la strada da percorrere? O forse qualche strategia mista?
Inoltre, noto che la versione parallela conserva la struttura della directory; vale a dire, l'output è nell'ordine corretto. Significa che lo sta facendo in modo sequenziale o Python è solo gentile? Modifica: Blender ha risolto questa seconda domanda. Grazie, Blender!
Grazie per l'aiuto.
'p.map' restituisce le cose in ordine. Potresti voler vedere 'p.map_async' o' p.imap_unordered' – Blender
dipende da cosa fa qualcosa_ – yaccz
Puoi presumere che do_something sia una funzione piuttosto costosa che analizza il contenuto del file. – rhombidodecahedron