[PYTHON] Celui qui divise le fichier csv, le lit et le traite en parallèle

Isono ~! J'ai un fichier csv qui contient des millions d'enregistrements, alors divisons-le et traitons-le en parallèle!

Remarques

――Je ne vous ai pas vu faire du fractionnement et de la mise en parallèle, alors je l'ai écrit sous forme de mémorandum, dites-moi s'il y a un bel article --python3.7 --Je n'utilise pas de pandas

Je vais le faire tout de suite

Fichier à lire

sample.csv


1,Ah
2,je
3,U
4,e
5,Oh

J'ai emprunté gen_chunks () parce qu'il y avait une personne qui l'a fait https://stackoverflow.com/a/4957046 Quelqu'un a déjà fait la majeure partie du travail. Merci internet, merci ancêtres Cliquez ici pour le code complété

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()

résultat


start [['1', 'Ah'], ['2', 'je']]
start [['3', 'U'], ['4', 'e']]
start [['5', 'Oh']]
finish [['5', 'Oh']]
finish [['1', 'Ah'], ['2', 'je']]
finish [['3', 'U'], ['4', 'e']]

Puisque chunksize = 2, deux enregistrements sont passés à do_something (). Si c'est un gros csv, faisons le bien ici. Je récupère une erreur avec _ = [r.get () for r in results]. Je devrais gérer l'erreur, mais je l'omets car c'est gênant Il semble y avoir une meilleure façon de l'écrire, alors faites-le moi savoir si vous savez

De plus, comme indiqué dans stackoverflow, si la partie de réinitialisation du tableau de gen_chunks () est définie sur del chunk [:], la sortie sera la suivante.

résultat


start [['5', 'Oh']]
start [['5', 'Oh']]
start [['5', 'Oh']]
finish [['5', 'Oh']]
finish [['5', 'Oh']]
finish [['5', 'Oh']]

Je n'ai pas bien lu les commentaires donc j'ai été témoin d'un résultat décevant C'est triste

Recommended Posts

Celui qui divise le fichier csv, le lit et le traite en parallèle
Script Python qui lit les fichiers SQL, exécute BigQuery et enregistre le csv
Formatez le journal Git et obtenez le nom du fichier validé au format csv
Trouvez-le dans la file d'attente et modifiez-le
Prédisez la quantité d'énergie utilisée en 2 jours et publiez-la au format CSV
Gérez CSV avec l'élément que vous souhaitez analyser dans le nom du fichier
Notez que je comprends l'algorithme des moindres carrés. Et je l'ai écrit en Python.
Celui qui affiche la barre de progression en Python
Dans bash, "supprimez le fichier s'il existe".
J'ai créé un outil en Python qui clique avec le bouton droit sur un fichier Excel et le divise en fichiers pour chaque feuille.
Extrayez les informations de paroles dans le fichier MP3 / MP4 et enregistrez-les dans le fichier de paroles (* .lrc) pour Sony Walkman.
Je veux remplacer les variables dans le fichier de modèle python et le produire en masse dans un autre fichier
Lisez le fichier csv avec le notebook jupyter et écrivez le graphique l'un sur l'autre
Un script qui ouvre les URL écrites en CSV dans l'ordre et prend une capture d'écran en plein écran
Enregistrez le modèle pystan et les résultats dans un fichier pickle
[Python] Lisez le fichier csv et affichez la figure avec matplotlib
Obtenez le type MIME en Python et déterminez le format de fichier
Goroutine (contrôle parallèle) utilisable sur le terrain
Gratter la liste des magasins membres Go To EAT dans la préfecture de Fukuoka et la convertir en CSV
Gratter la liste des magasins membres Go To EAT dans la préfecture de Niigata et la convertir en CSV
Lire et écrire un fichier csv
Recherchez le nom du fichier, y compris le mot et l'extension spécifiés dans le répertoire
Racler le calendrier de Hinatazaka 46 et le refléter dans Google Agenda
[Note] Sur la base de la latitude et de la longitude du fichier CSV, nous avons créé un script qui extrait les données dans la plage cible et ajoute un code de maillage.