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的主要内容,如果未能解决你的问题,请参考以下文章
FacesServlet.service() 方法在处理请求时消耗了太多时间(自费时间高)
与 SqlDataAdapter.Fill() 相比,DataTable.Load() 花费了太多时间