問題: Python での大規模な .csv ファイル (最大 100 万行、200 列) の読み取り2.7 ではメモリ エラーが発生しました。
最初のアプローチでは、ファイル全体を反復処理し、データをリストとしてメモリに保存します。ただし、この方法はメモリを過剰に消費するため、大きなファイルの場合は実用的ではありません。
解決策:
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)) return
3.メモリ消費の最適化:
ジェネレーター関数も使用するように getdata() をリファクタリングし、常に 1 行のみがメモリに保持されるようにします。
def getdata(filename, criteria): for criterion in criteria: for row in getstuff(filename, criterion): yield row
速度に関するその他のヒント:
以上がPython 2.7 で大きな CSV ファイルを効果的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。