我正在努力想出一种有效的方法来解决"(system(paste0('kill ',Sys.getpid())))"
dask.dataframe
+ groupby
的典型用例,并且想知道我是否遗漏了一些明显的东西(various docs说到这个问题,但我无法完全解决它。)
简而言之,我正在尝试加载一个中等大小(比如10GB)的数据帧,按一些列分组,为每个子集训练一个机器学习模型(每个模型几秒钟,~100k子集),并保存模型到磁盘。到目前为止,我最好的尝试是:
apply
无论我如何尝试c = Client()
df = dd.read_parquet('data.parquet')
df = c.persist(dd.set_index('key')) # data is already sorted by key
result = c.compute(df.groupby(df.index).apply(train_and_save_model))
数据,与实际计算相比,我似乎在序列化/ IO上花费了大量时间。一个愚蠢的天真的解决方法是先写入100k单独的Parquet文件,然后将文件名传递给工人加载/训练,这似乎更有效率;我很难理解为什么会有不同的表现。设置索引和分区的想法不是每个工作者都能理解它应该读取的文件的哪些部分?我想我在这里遗漏了一些明显的东西,所以任何指导都会受到赞赏。
答案 0 :(得分:0)
看来,使用index='key'
读取的数据与使用set_index
重新编入索引的数据之间存在很大差异;我认为如果新索引已经排序,那么就没有洗牌成本,但我猜这是错误的。
更改为dd.read_parquet('data.parquet', index='key')
似乎表现得像我希望的那样,所以我很高兴(尽管仍然很好奇为什么set_index
在这种情况下似乎不必要地改变了。)