小能豆

读取巨大的.csv 文件

python

我目前正在尝试从 Python 2.7 中的 .csv 文件中读取数据,这些文件最多有 100 万行和 200 列(文件大小从 100mb 到 1.6gb)。对于行数少于 300,000 的文件,我可以(非常慢地)执行此操作,但一旦超过这个数目,就会出现内存错误。我的代码如下所示:

def getdata(filename, criteria):
    data=[]
    for criterion in criteria:
        data.append(getstuff(filename, criteron))
    return data

def getstuff(filename, criterion):
    import csv
    data=[]
    with open(filename, "rb") as csvfile:
        datareader=csv.reader(csvfile)
        for row in datareader: 
            if row[3]=="column header":
                data.append(row)
            elif len(data)<2 and row[3]!=criterion:
                pass
            elif row[3]==criterion:
                data.append(row)
            else:
                return data

getstuff 函数中存在 else 子句的原因是所有符合条件的元素都将一起列在 csv 文件中,因此当我经过它们时我会离开循环以节省时间。

我的问题是:

  1. 我怎样才能让它处理更大的文件?
  2. 有什么方法可以让它更快吗?

我的电脑有 8GB RAM,运行 64 位 Windows 7,处理器为 3.40 GHz(不确定您需要什么信息)。


阅读 38

收藏
2024-08-26

共1个答案

小能豆

处理大 CSV 文件并避免内存错误的几种方法如下:

1. 分块读取数据

你可以使用 pandas 中的 read_csv 函数的 chunksize 参数,按块读取数据,而不是一次性读取整个文件。这样可以避免内存占用过高的问题。

import pandas as pd

def getstuff(filename, criterion):
    chunksize = 10000  # 每次读取10000行
    data = []
    for chunk in pd.read_csv(filename, chunksize=chunksize):
        for index, row in chunk.iterrows():
            if row[3] == "column header":
                data.append(row)
            elif len(data) < 2 and row[3] != criterion:
                pass
            elif row[3] == criterion:
                data.append(row)
            else:
                return data
    return data

2. 优化数据过滤

在你当前的代码中,每次都会遍历整个文件。可以考虑优化你的过滤条件,减少数据的读取量。

3. 使用低级别的数据处理方法

如果 pandas 依然无法满足需求,你可以考虑用 csv 模块逐行读取,并对每一行进行处理。这种方法更低级,但也更省内存。

4. 增加虚拟内存

如果你在处理大文件时遇到内存错误,可以考虑增加系统的虚拟内存,或者使用64位的Python环境,这样可以更好地利用系统的内存。

5. 内存优化

通过减少不必要的数据存储或转换为更高效的数据结构(如 numpy 数组)可以减少内存占用。

可以根据你的具体需求来选择适合的方案。如果你有更多问题,欢迎继续讨论!

2024-08-26