Maison  >  Article  >  développement back-end  >  Comment gérer les problèmes de mémoire lors de la lecture de gros fichiers CSV en Python ?

Comment gérer les problèmes de mémoire lors de la lecture de gros fichiers CSV en Python ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-09 05:07:02399parcourir

How to Handle Memory Issues When Reading Large CSV Files in Python?

Lecture de vastes fichiers CSV en Python

Dans Python 2.7, les utilisateurs rencontrent souvent des problèmes de mémoire lors de la lecture de fichiers CSV contenant des millions de lignes et des centaines de colonnes. Cet article aborde ces défis et propose des solutions pour traiter efficacement les gros fichiers CSV.

Code d'origine et problèmes

Le code fourni vise à lire des lignes spécifiques d'un fichier CSV basé sur sur un critère donné. Cependant, il charge toutes les lignes dans une liste avant le traitement, ce qui entraîne des erreurs de mémoire pour les fichiers dépassant 300 000 lignes.

Solution 1 : traiter les lignes de manière incrémentielle

Pour éliminer le problème de mémoire, il est crucial de traiter les lignes de manière incrémentale au lieu de les stocker dans une liste. Une fonction génératrice peut être utilisée pour y parvenir :

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

Cette fonction génère la ligne d'en-tête et les lignes suivantes qui correspondent au critère, puis arrête la lecture.

Solution 2 : Filtrage optimisé

Alternativement, une méthode de filtrage plus concise peut être utilisée :

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

Cette méthode utilise les fonctions takewhile et dropwhile du module itertools pour filtrer les lignes.

Code mis à jour

Dans la fonction getdata, la compréhension de liste est remplacée par une compréhension de générateur :

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

Conclusion

En utilisant les fonctions du générateur et en optimisant les techniques de filtrage, il est possible de traiter efficacement des fichiers CSV volumineux, en évitant les erreurs de mémoire et en améliorant considérablement les performances.

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