【发布时间】:2020-12-30 01:07:39
【问题描述】:
我正在尝试对数据集进行 onehot 编码,然后按特定列进行分组,这样我就可以为该列中的每个项目获取一行,并汇总查看哪些 onehot 列对于该特定行是正确的。它似乎适用于小数据,而使用 dask 似乎适用于大型数据集,但是当我尝试保存文件时遇到问题。我试过 CSV 和镶木地板文件。我想保存结果,然后我可以稍后分块打开它。
这里是显示问题的代码(下面的脚本生成 2M 行和多达 30k 个唯一值到 onehot 编码)。
import pandas as pd
import numpy as np
import dask.dataframe as dd
from dask.distributed import Client, LocalCluster, wait
sizeOfRows = 2000000
columnsForDF = 30000
partitionsforDask = 500
print("partition is ", partitionsforDask)
cluster = LocalCluster()
client = Client(cluster)
print(client)
df = pd.DataFrame(np.random.randint(0,columnsForDF,size=(sizeOfRows, 2)), columns=list('AB'))
ddf = dd.from_pandas(df, npartitions=partitionsforDask)
# ddf = ddf.persist()
wait(ddf)
# %%time
# need to globally know the categories before one hot encoding
ddf = ddf.categorize(columns=["B"])
one_hot = dd.get_dummies(ddf, columns=['B'])
print("starting groupby")
# result = one_hot.groupby('A').max().persist() # or to_parquet/to_csv/compute/etc.
# result = one_hot.groupby('A', sort=False).max().to_csv('./daskDF.csv', single_file = True)
result = one_hot.groupby('A', sort=False).max().to_parquet('./parquetFile')
wait(result)
它似乎可以工作,直到它对 csv 或 parquet 进行 groupby。那时,我收到很多关于工人超过 95% 内存的错误,然后程序以“killedworker”异常退出:
distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting
KilledWorker: ("('dataframe-groupby-max-combine-3ddcd8fc854613101b4bdc7fccde32cd', 1, 0, 0)", <Worker 'tcp://127.0.0.1:33815', name: 6, memory: 0, processing: 22>)
监控我的机器,我从来没有接近超过内存,我的驱动器空间超过 300 GB,从未使用过(在此过程中没有创建文件,尽管它在 groupby 部分中)。
我能做什么?
更新 - 我想我会添加一个奖项。我对 .to_csv 也有同样的问题,因为其他人也有类似的问题,我希望它对广大受众有价值。
【问题讨论】:
-
fwiw 我可以在 jupyter.org/tryjupyter.org/try的 jupyter notebook 中重现这个
-
嘿,你解决了这个问题吗?
-
@HanaKaze nope,无法解决此问题并找到了不同的解决方案。使用嵌入而不是一种热编码。
标签: python pandas dask dask-distributed