连接大型数据帧时出现 MemoryError

数据挖掘 Python 数据集 熊猫
2022-03-05 16:55:00

我正在创建一个读取 CSV 字段并允许用户指定他们想要分类的列然后对这些列进行分类的工具。

我的问题是这些 CSV 文件非常大,当尝试连接数据帧时,我的电脑死机并且出现 MemoryError。

我将数据帧分成块并get_dummies在每个块上完成功能并将其存储到列表中。这没有任何问题。

然后我尝试连接整个列表,如下面的代码所示。

我还删除了数据帧和块列表以节省内存。

dummies = []
columns = self.df[self.selectedHeaders]
del self.df
chunks = (len(columns) / 10000) + 1
df_list = np.array_split(columns, chunks)
del columns

for i, df_chunk in enumerate(df_list):
    print("Getting dummy data for chunk: " + str(i))
    dummies.append(pd.get_dummies(df_chunk))

del df_list
dummies = pd.concat(dummies, axis=1)

从这段代码中可以看出,我存储了我需要的列并将它们分成块。然后我get_dummies在每个块上运行该函数并将它们存储在一个列表中。

当我运行该concat函数时,我要么崩溃,要么出现 MemoryError。如果我可以让代码运行并抛出该错误而不会崩溃,我会在这里更新它。

1个回答

你应该使用稀疏矩阵

当您对列进行分类时,您会创建许多主要包含零的列,并且由于密集的数据结构会跟踪所有零,因此内存使用量会激增。另一方面,稀疏矩阵只跟踪非零值及其索引。有许多版本的稀疏矩阵针对不同的用例进行了优化。