使用自定义功能将dask bag写入DB

时间:2020-08-15 08:40:57

标签: python dask

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

def write_to_db(x):
   # code to write into db
   db.insert_many(x)
   return

def func():
   # code to process each element
   for col in int_cols:
       try:
           x[col] = int(x[col])
       except (ValueError, TypeError):
           x[col] = None

import dask.bag as db

bag = db.read_text(...)
bag = bag.map_partitions(csv.DictReader).map(func).map_partitions(write_to_db)
bag.compute()

现在,当我看一下任务列表时,在每个分区完成write_to_db函数之后,它显示为memory而不是released

我的问题:

  1. 如何告诉dask没有返回值,因此将内存标记为已释放?例如,在下图中,我希望将右侧的红色正方形标记为released,即蓝色。
  2. func()版本GIL是否存在?反正有优化这种计算的方法吗?
  3. 我是否在进行这种计算的正确方法? (通过将自定义函数传递给map_partition插入db)

Dask Task Graph

1 个答案:

答案 0 :(得分:1)

  1. 是的,Dask将隐式的返回None值作为结果保存在内存中,但是这些值很小,我不会担心。您的compute()的输出将是一组None的集合(实际上,为了使购物袋更合理,您可能希望将其列为列表)
  2. Dask不会为您发布GIL,但是您调用的DB函数可能会-阅读该项目的文档;如果它没有发布GIL,则可能会看到更多的进程和更少的线程/进程,您会看到更好的性能
  3. 这似乎是个好方法。使用dask.delayed的版本的行数可能大致相同。