读取巨大的 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中文网其他相关文章!