在map_blocks

时间:2018-11-08 00:59:04

标签: dask numba

我已经成功地在dask数组上使用了map_blocks几次。我现在正尝试部署一个numba函数来对每个块进行操作,并对其中一个输入进行操作和更改。

numba函数接收2个numpy数组,并更新第二个。然后在return语句中将其返回,从而使其可用于map_blocks。

该函数在numpy数组上可以正常工作,但是当从map_blocks调用python时,它只会崩溃。不作用于输入数组的numba函数的行为正常(尽管在这种情况下很难使它们执行任何有用的操作)。 这是已知限制吗?有毛病吗我使用错了吗? 更新 最后,我将其简化为具有简单numba函数的可重现示例,并且我对问题有了更清晰的认识。但是,我仍然不清楚如何解决该问题。这是代码:

import numpy as np
from numba import jit, float64, int64
from dask.distributed import Client, LocalCluster
import dask.array as da
cluster=LocalCluster()
c=Client(cluster)
size=int(1e5)
a=np.arange(size,dtype='float64')
b=np.zeros((size,),dtype='float64')
dista=da.from_array(a,chunks=size//4)
distb=da.from_array(b,chunks=size//4)
@jit(float64[:](float64[:],float64[:]))
def crasher(x,y):
    for i in range(x.shape[0]):
        y[i]=x[i]*2
    return y
distc=da.map_blocks(crasher,dista,distb,dtype='float64')
c=distc.compute() #it all crashes at this point

现在我得到了一个更容易理解的错误,而不仅仅是崩溃:

TypeError: No matching definition for argument type(s) readonly array(float64, 1d, C), readonly array(float64, 1d, C)

因此,如果numba接收设置了write = False的numpy数组,那么如何使numba进行任何有用的工作?您不能在numba函数中添加数组创建行,也不能向其提供可写数组。

对如何实现这一目标有何看法?

1 个答案:

答案 0 :(得分:1)

这是带有数组创建功能的代码版本,可以在numba nopython模式下正常运行

import numpy as np
from numba import jit, float64, int64
from dask.distributed import Client, LocalCluster
import dask.array as da
cluster=LocalCluster()
c=Client(cluster)
size=int(1e5)
a=np.arange(size,dtype='float64')
dista=da.from_array(a,chunks=size//4)

@jit(nopython=True)
def crasher(x):
    y = np.empty_like(x)
    for i in range(x.shape[0]):
        y[i]=x[i]*2
    return y
distc=da.map_blocks(crasher,dista,dtype='float64')
c=distc.compute()

请注意y=行。请注意,根据文档,list of numpy functions受支持。