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é :
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!