如何在 Python 2.7 中有效处理巨大的 CSV 文件而不遇到内存问题?

Linda Hamilton
发布: 2024-11-08 04:52:01
原创
998 人浏览过

How can I efficiently process gigantic CSV files in Python 2.7 without running into memory issues?

读取巨大的 CSV 文件:优化内存和速度

当尝试处理具有数百万行和数百列的大量 CSV 文件时,传统方法使用迭代器的方法可能会导致与内存相关的问题。本文探讨了 Python 2.7 中处理大规模 CSV 数据的优化技术。

内存优化:

内存问题的症结在于构建内存列表来存储大型数据集。为了缓解这个问题,Python 提供了yield 关键字,它将函数转换为生成器函数。这些函数在每个yield语句后暂停执行,允许在遇到数据时增量处理数据。

通过使用生成器函数,您可以逐行处理数据,无需将整个文件存储在内存中。以下代码演示了这种方法:

import csv

def getstuff(filename, criterion):
    with open(filename, "rb") as csvfile:
        datareader = csv.reader(csvfile)
        yield next(datareader)  # yield header row

        count = 0
        for row in datareader:
            if row[3] == criterion:
                yield row
                count += 1
            elif count:  # stop processing when a consecutive series of non-matching rows is encountered
                return
登录后复制

速度增强:

此外,您可以利用 Python 的 dropwhile 和 takewhile 函数进一步提高处理速度。这些功能可以有效地过滤数据,使您能够快速找到感兴趣的行。具体方法如下:

from itertools import dropwhile, takewhile

def getstuff(filename, criterion):
    with open(filename, "rb") as csvfile:
        datareader = csv.reader(csvfile)
        yield next(datareader)  # yield header row

        yield from takewhile(  # yield matching rows
            lambda r: r[3] == criterion,
            dropwhile(  # skip non-matching rows
                lambda r: r[3] != criterion, datareader))
        return
登录后复制

简化循环处理:

通过组合生成器函数,您可以大大简化循环数据集的过程。下面是 getstuff 和 getdata 的优化代码:

def getdata(filename, criteria):
    for criterion in criteria:
        for row in getstuff(filename, criterion):
            yield row
登录后复制

现在,您可以直接迭代 getdata 生成器,它会逐行生成行流,释放宝贵的内存资源。

请记住,目标是最大限度地减少内存数据存储,同时最大限度地提高处理效率。通过应用这些优化技术,您可以有效地处理巨大的 CSV 文件,而不会遇到内存障碍。

以上是如何在 Python 2.7 中有效处理巨大的 CSV 文件而不遇到内存问题?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板