Problème: Reading Massive .csv Fichiers (jusqu'à 1 million de lignes, 200 colonnes) dans Python 2.7 relève des erreurs de mémoire. Cependant, cette méthode devient peu pratique pour les fichiers volumineux, car il consomme une mémoire excessive.
Solution:
1. Processez les lignes telles qu'elles sont produites:
Évitez de charger le fichier entier en mémoire. Au lieu de cela, traitez les lignes telles qu'elles sont générées à l'aide d'une fonction de générateur.
def getStuff (nom de fichier, critère): avec ouvert (nom de fichier, "RB") comme CSVFile: DataReader = CSV.Reader (CSVFile) rendement suivant (DataReader) # rendement la ligne d'en-tête Pour Row dans DataReader: Si Row [3] == Critère: Row Row
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 row2. Utilisez des fonctions de générateur pour filtrer:
Filtrez les données tout en itérant 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 (nom de fichier, critère): avec ouvert (nom de fichier, "RB") comme CSVFile: DataReader = CSV.Reader (CSVFile) rendement suivant (DataReader) # rendement la ligne d'en-tête Rendement de Take Whik ( lambda r: r [3] == critère, Drop-the (Lambda r: r [3]! = Criterion, dataReader)) return
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 row3. Optimiser la consommation de mémoire:
Refactor getData () pour utiliser également une fonction de générateur, en veillant à ce qu'une seule ligne soit maintenue en mémoire à tout moment.
def getData (nom de fichier, critères): pour les critères de critères: pour Row in GetStuff (nom de fichier, critère): Row Row
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 rowConseils supplémentaires pour la vitesse:
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3