ホームページ >バックエンド開発 >Python チュートリアル >Python で大きな CSV ファイルを読み取るときにメモリの問題を処理するにはどうすればよいですか?
Python での膨大な CSV ファイルの読み取り
Python 2.7 では、ユーザーが数百万行、数百行の CSV ファイルを読み取るときにメモリの問題が発生することがよくあります。列。この記事では、これらの課題に対処し、大規模な CSV ファイルを効率的に処理するためのソリューションを提供します。
元のコードと問題
提供されたコードは、CSV ファイル ベースの特定の行を読み取ることを目的としています。与えられた基準で。ただし、処理前にすべての行がリストに読み込まれるため、300,000 行を超えるファイルではメモリ エラーが発生します。
解決策 1: 行を段階的に処理する
メモリの問題があるため、行をリストに保存するのではなく段階的に処理することが重要です。これを実現するには、ジェネレーター関数を使用できます。
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:最適化されたフィルタリング
または、より簡潔なフィルタリング方法を使用できます。採用:
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))
このメソッドは、itertools モジュールの takewhile 関数とdropwhile 関数を使用して行をフィルターします。
更新されたコード
getdata 関数、リスト内包表記はジェネレーターに置き換えられます理解:
def getdata(filename, criteria): for criterion in criteria: for row in getstuff(filename, criterion): yield row
結論
ジェネレータ関数を使用し、フィルタリング手法を最適化することで、大きな CSV ファイルを効果的に処理し、メモリ エラーを回避し、パフォーマンスを大幅に向上させることができます。 .
以上がPython で大きな CSV ファイルを読み取るときにメモリの問題を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。