是否有一种方法来获取dask数组的唯一行,该行大于可用内存?理想情况下,无需将其转换为简单的DataFrame?
我目前正在使用这种方法
import dask.array as da
import dask.dataframe as dd
dx = da.random.random((10000, 10000), chunks=(1000, 1000))
ddf = dd.from_dask_array(dx)
ddf = ddf.drop_duplicates()
dx = ddf.to_dask_array(lengths=True)
适用于比np.unique(dx, axis=0)
大的数据集,但最终也耗尽了内存。
我正在使用Python 3.6(但可以升级),Dask 0.20和Ubuntu 18.04 LTS。
答案 0 :(得分:3)
您始终可以只使用numpy.unique
:
import dask.array as da
import numpy as np
dx = da.random.random((10000, 10000), chunks=(1000, 1000))
dx = np.unique(dx, axis=0)
当您尝试将其与“大于我的RAM的数据集”一起使用时,这可能仍会给您带来内存问题,因为它将在单个节点上运行计算。有一个dask.array.unique
函数,但尚不支持axis
关键字。这意味着它将使数组变平并返回唯一的单个值,而不是唯一的行。在dask.array
中似乎也没有实现允许任何形式的手动并行化版本的排序功能。
我的建议是暂时将其吸纳并转换为dask.dataframe
。即使不是最快的实现方式,这种方法也可以确保您获得正确的输出。
我最初认为可能有一个简单的技巧可以用来为axis
实现dask.array.unique
参数。但是,由于存在块,blob type trick that numpy.unqiue
uses to implement its own axis
keyword证明不容易转移到Dask数组。
因此,暂时没有巧妙的解决方法。只需使用dask.dataframe
。