Python 使用自定义函数将dask包写入数据库

Python 使用自定义函数将dask包写入数据库,python,dask,Python,Dask,我正在dask bag上运行一个函数,将数据转储到NoSQL DB中,如: def写入数据库(x): #要写入数据库的代码 db.插入多个(x) 返回 def func(): #处理每个元素的代码 对于整数列中的列: 尝试: x[col]=int(x[col]) 除了(ValueError、TypeError): x[col]=无 将dask.bag作为数据库导入 bag=db.读取文本(…) bag=bag.map\u分区(csv.DictReader).map(func).map\u分区(写

我正在dask bag上运行一个函数,将数据转储到NoSQL DB中,如:

def写入数据库(x):
#要写入数据库的代码
db.插入多个(x)
返回
def func():
#处理每个元素的代码
对于整数列中的列:
尝试:
x[col]=int(x[col])
除了(ValueError、TypeError):
x[col]=无
将dask.bag作为数据库导入
bag=db.读取文本(…)
bag=bag.map\u分区(csv.DictReader).map(func).map\u分区(写入数据库)
bag.compute()
现在,当我查看dask任务图时,在每个分区完成write_to_db函数后,它将显示为
内存
,而不是
已释放

我的问题是:

  • 如何告诉dask没有返回值,从而将内存标记为已释放?例如,在下图中,我希望右侧的红色方块标记为
    已发布
    ,即蓝色
  • func()
    是否释放了
    GIL
    ?有没有办法优化这种计算
  • 我做这种计算的方法正确吗?(通过将自定义函数传递到map_分区,插入数据库)
  • 是的,Dask将隐式返回
    None
    值作为内存中的结果,但是这些值很小,我不担心。您的
    compute()
    的输出将是一组
    None
    s(实际上,为了保持行李排列,您可能需要将其列为一个列表)
  • Dask不会为您发布GIL,但您调用的DB函数可能会读取该项目的文档;如果不释放GIL,您可能会看到更多进程和更少线程/进程的性能更好
  • 这似乎是一个好办法。使用
    dask.delayed
    的版本可能具有相同的行数

  • 实际上,我想知道我们是否可以将
    write\u to\u db
    函数作为func的一种简化类型来传递。这样,我认为内存中的键会显示为released。您可能会打开“output”,但这取决于几个写函数,因此图形可能看起来更完整,但在所有操作完成之前,您仍然不会清除键。通常,这正是人们想要的。