【问题标题】:Avoid using up too much memory with CSV file in Python?避免在 Python 中使用 CSV 文件占用过多内存?
【发布时间】:2013-11-08 15:02:59
【问题描述】:

我有 100 个 CSV 文件,它们都包含来自不同时间段的相似信息。我只需要从每个时间段中提取某些信息,不需要将所有数据存储到内存中。

现在我使用的东西看起来像:

import pandas as pd
import numpy as np
import glob

average_distance = []
for files in glob.glob("*2013-Jan*"): # Here I'm only looking at one file
    data = pd.read_csv(files)

    average_distance.append(np.mean(data['DISTANCE']))
    rows = data[np.logical_or(data['CANCELLED'] == 1, data['DEP_DEL15'] == 1)]

    del data

我的问题是:有什么方法可以使用生成器来做到这一点,如果是这样,这是否会加快进程,让我轻松浏览 100 个 CSV 文件?

我认为这可能是在正确的轨道上:

def extract_info():
average_distance = []
for files in glob.glob("*20*"):
    data = pd.read_csv(files)

    average_distance.append(np.mean(data['DISTANCE']))
    rows = data[np.logical_or(data['CANCELLED'] == 1, data['DEP_DEL15'] == 1)]

    yield rows

cancelled_or_delayed = [month for month in extract_info()]

谢谢!

【问题讨论】:

    标签: python memory csv generator


    【解决方案1】:

    Pandas 的 read_csv 方法经过高度优化:您可以提供参数,例如要读取的列和块大小,如docs 中所述。所以你的电话可能看起来像这样:

    data = pd.read_csv(files, usecols=['Column_X', 'Column_Y'], chunksize=10000)
    

    【讨论】:

    • 看起来很方便,但是我可以像在我的代码中那样根据某个列中的条件进行过滤吗?
    • 过滤行不是内置的,但是您可以按照您的建议使用生成器,请在此处查看此答案:stackoverflow.com/a/13653490/918626 看看您是否仍然遇到内存问题会很有趣通过使用“chunksize”和“usecols”
    猜你喜欢
    • 1970-01-01
    • 2010-12-25
    • 2021-04-26
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2013-07-11
    • 2020-05-18
    • 2020-09-06
    相关资源
    最近更新 更多