Pandas `read_csv` 方法使用了太多 RAM

Posted

技术标签:

【中文标题】Pandas `read_csv` 方法使用了太多 RAM【英文标题】:Pandas `read_csv` Method Is Using Too Much RAM 【发布时间】:2018-01-13 22:07:14 【问题描述】:

我目前在 Kaggle 上使用 Rotten Tomatoes dataset,同时使用 pandas DataFrame() 来操作数据。

我已经从 sklearn 实现了CountVectorizer() 来提取特征(大小为 5000)。然后,我将 10 万行特征和标签保存到 .csv 中。更准确地说,.csv 总共有 100k 行和 5001 列。 它的大小约为 1gb 内存。

当我尝试阅读 .csv 时,问题出现了:

pd.read_csv('train.csv', header=0, 
             delimiter=",", engine='c', na_filter=False, dtype=np.int64)

CSV 解析器使用了过多的 RAM。我的系统上有 8gb 的 RAM,这显然是不够的。

有什么方法可以减少 RAM 的使用?我不受限于 pandas 库。

【问题讨论】:

好吧pandas 是一个内存数据操作框架,并且通过机器学习,您需要整个数据集来训练而不是块,因此您需要迁移到云端或减少特征数量你有。 @aws_apprentice 实际上我可以(而且我确实)使用块。 IE。增量学习。 scikit-learn中的一些分类器有partial_fit方法(我用的是SGDClassifier,它有),所以你可以按块训练分类器。 您可以分块(或单独的行)解析数据,将每个块转换为scipy.sparse.csr_matrix 就像我说的我对机器学习不太熟悉,所以我不知道。如果您可以分块读取它,那么 pandas 带有一个 chunksize 选项,您可以通过将其制成生成器来进一步优化,这样您就不会一次在内存中保存太多数据。 【参考方案1】:

您可以尝试在pandas.read_csv 中使用chunksize 选项。它将允许您批量处理数据,避免一次将所有数据加载到内存中。当您处理每个批次时,您可以删除任何不必要的列并将数据保存在一个新的、更薄的对象中,您可以将其放入内存中。下面是一个例子:

chunks = pd.read_csv('train.csv', header=0, delimiter=",", engine='c', na_filter=False, dtype=np.int64, chunksize=50000)

slim_data = []
for chunk in chunks:
    do your processing here
final_data = pd.concat(slim_data)

在示例中,每个块是 50,000 条记录,格式为 pandas DataFrame。然后遍历 50,000 条记录的每个块,您可以在其中对每个块进行处理并将处理后的 DataFrame 附加到一个新对象(slim_data 作为上面的示例),然后将所有块连接在一起成为您可以使用的最终 DataFrame在您的建模中。

重申一下,只有在处理每批数据时,您要删除数据元素或以更有效的方式表示数据元素时,上述方法才有效,否则您将再次遇到内存问题。但是,这将使您不必一次将所有数据加载到内存中。

【讨论】:

以上是关于Pandas `read_csv` 方法使用了太多 RAM的主要内容,如果未能解决你的问题,请参考以下文章

去除与Pandas中相邻点偏离太多的点

FacesServlet.service() 方法在处理请求时消耗了太多时间(自费时间高)

对信号量进行了太多帖子

与 SqlDataAdapter.Fill() 相比,DataTable.Load() 花费了太多时间

Pandas总结第二节 Pandas 的数据读取_pd.read_csv()的使用详解(非常全面,推荐收藏)

Python Pandas 中的引擎 read_csv