在不使用 dask 数据框的情况下获取 dask 数组的唯一行

Get unique rows of dask array without using dask dataframe

有没有办法获取大于可用内存的 dask 数组的唯一行?理想情况下,不将其转换为 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。

你总是可以只使用 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)

当您尝试将它与 "data sets larger than my RAM" 一起使用时,这可能仍然会给您带来内存问题,因为它将 运行 在单个节点上进行计算。有一个 dask.array.unique 函数,但它还不支持 axis 关键字。这意味着它将展平数组和 return 唯一的单个值,而不是唯一的行。 dask.array 似乎也没有实现允许任何类型的手动并行化版本的排序功能。

我的建议是暂时接受并转换为 dask.dataframe。这种方法可确保您获得正确的输出,即使它不是最快的实现。

编辑

我最初认为可能有一个简单的 hack 可以用来实现 dask.array.uniqueaxis 参数。但是,由于存在块,blob type trick that numpy.unqiue uses to implement its own axis keyword 无法轻易转移到 Dask 数组。

所以目前没有聪明的解决方法。只需使用 dask.dataframe.