ホームページ >バックエンド開発 >Python チュートリアル >Python で大きな CSV ファイルを読み取るときにメモリの問題を処理するにはどうすればよいですか?

Python で大きな CSV ファイルを読み取るときにメモリの問題を処理するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-09 05:07:02455ブラウズ

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

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。