我对推荐的从密集的numpy对象创建cudf DataFrames的快速方法很感兴趣。我见过许多这样的例子:将2dnumpy矩阵的列拆分成元组,然后对元组列表调用cudf.DataFrame --这是相当昂贵的。使用numba.cuda.to_device是相当快的。是否可以使用numba.cuda.to_device,或者是否有更有效的方法来构建DataFrame?
In [1]: import cudf
In [2]: import numba.cuda
In [3]: import numpy as np
In [4]: data = np.random.random((300,100))
In [5]: data.nbytes
Out[5]: 240000
In [6]: %time numba.cuda.to_device(data)
CPU times: user 8 ms, sys: 0 ns, total: 8 ms
Wall time: 4.45 ms
Out[6]: <numba.cuda.cudadrv.devicearray.DeviceNDArray at 0x7f8954f84550>
In [7]: record_data = (('fea%d'%i, data[:,i]) for i in range(data.shape[1]))
In [8]: %time cudf.DataFrame(record_data)
CPU times: user 960 ms, sys: 508 ms, total: 1.47 s
Wall time: 1.61 s
Out[8]: <cudf.DataFrame ncols=100 nrows=300 >上面的代码显示,与直接调用numba.cuda.to_device相比,cudf.DataFrame要慢大约360倍
发布于 2020-01-08 00:45:33
cudf.DataFrame是一种专用的列格式,对于非常高而不是很宽的数据,它的性能最好。但是,我们有一些重要的零拷贝功能,允许您在numba/cupy/cudf之间以较低的成本移动数据。目前,据我所知,将原始numpy矩阵转换为cudf的最佳方法是使用您所确定的to_device方法,然后是cudf中的from_gpu_matrix。
import cudf
import numba.cuda
import numpy as np
data = np.random.random((300, 100))
%time gpu = numba.cuda.to_device(data)
%time df = cudf.DataFrame.from_gpu_matrix(gpu, columns = ['fea%d'%i for i in range(data.shape[1])])输出:
CPU times: user 4 ms, sys: 0 ns, total: 4 ms
Wall time: 872 µs
CPU times: user 180 ms, sys: 0 ns, total: 180 ms
Wall time: 186 ms创建cudf.DataFrame所需的186ms是最短的创建时间,主要用于主机端的列内存和元数据管理。
发布于 2021-02-01 06:28:46
请允许我提一下,cudf.DataFrame.from_gpu_matrix()方法从Rapids0.17开始就被弃用了。
现在,cudf.DataFrame()接受Numba DeviceNDArrays作为输入数据。
import cudf
import numba as nb
# Convert a Numba DeviceNDArray to a cuDF DataFrame
src = nb.cuda.to_device([[1, 2], [3, 4]])
dst = cudf.DataFrame(src)
print(type(dst), "\n", dst)https://stackoverflow.com/questions/55922162
复制相似问题