在不使用 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.unique
的 axis
参数。但是,由于存在块,blob type trick that numpy.unqiue
uses to implement its own axis
keyword 无法轻易转移到 Dask 数组。
所以目前没有聪明的解决方法。只需使用 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.unique
的 axis
参数。但是,由于存在块,blob type trick that numpy.unqiue
uses to implement its own axis
keyword 无法轻易转移到 Dask 数组。
所以目前没有聪明的解决方法。只需使用 dask.dataframe
.