ホームページ  >  記事  >  バックエンド開発  >  Python 2.7 で大きな CSV ファイルを効果的に処理するにはどうすればよいですか?

Python 2.7 で大きな CSV ファイルを効果的に処理するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-08 03:32:02546ブラウズ

How to Effectively Handle Large CSV Files in Python 2.7?

Python での大きな .csv ファイルの読み取り

問題: 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

速度に関するその他のヒント:

  • チャンク サイズ パラメーターを指定して csv.reader を使用します: メモリ フットプリントを削減するには、ファイルをより小さいチャンクで読み取ります。
  • データベース エンジンの使用を検討してください: データが適合する場合は、より高速かつ効率的に処理するために、データをデータベースに保存します。

以上がPython 2.7 で大きな CSV ファイルを効果的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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