Maison  >  Article  >  développement back-end  >  Comment gérer efficacement les gros fichiers CSV dans Python 2.7 ?

Comment gérer efficacement les gros fichiers CSV dans Python 2.7 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-08 03:32:02544parcourir

How to Effectively Handle Large CSV Files in Python 2.7?

Lecture de gros fichiers .csv en Python

Problème : Lecture de fichiers .csv volumineux (jusqu'à 1 million de lignes, 200 colonnes) en Python 2.7 rencontre des erreurs de mémoire.

L'approche initiale parcourt l'intégralité du fichier et stocke les données en mémoire sous forme de listes. Cependant, cette méthode devient peu pratique pour les fichiers volumineux, car elle consomme trop de mémoire.

Solution :

1. Traitez les lignes au fur et à mesure de leur production :

Évitez de charger l'intégralité du fichier en mémoire. Au lieu de cela, traitez les lignes au fur et à mesure qu'elles sont générées à l'aide d'une fonction génératrice.

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

2. Utiliser les fonctions du générateur pour le filtrage :

Filtrer les données lors de l'itération dans le fichier à l'aide des fonctions du générateur. Cette approche permet de faire correspondre plusieurs lignes consécutives répondant à un critère spécifique.

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

3. Optimiser la consommation de mémoire :

Refactorisez getdata() pour utiliser également une fonction génératrice, en garantissant qu'une seule ligne est conservée en mémoire à tout moment.

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

Conseils supplémentaires pour la rapidité :

  • Utilisez csv.reader avec un paramètre de taille de bloc : Lisez les fichiers en morceaux plus petits pour réduire l'empreinte mémoire.
  • Envisagez d'utiliser un moteur de base de données : Si les données correspondent, stockez-les dans une base de données pour un traitement plus rapide et plus efficace.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn