繁体   English   中英

将迭代器传递给dask.delayed函数

[英]Passing an iterator to dask.delayed function

我正在尝试将迭代器通过(非标准)类似文件的对象传递给dask.delayed函数。 当我尝试compute() ,我从dask和以下回溯中获取了以下消息。

distributed.protocol.pickle - INFO - Failed to serialize 
  ([<items>, ... ], OrderedDict(..)).
Exception: self.ptr cannot be converted to a Python object for pickling

Traceback (most recent call last):
  File "/home/user/miniconda3/lib/python3.6/site-packages/distributed/protocol/pickle.py", line 38, in dumps
    result = pickle.dumps(x, protocol=pickle.HIGHEST_PROTOCOL)
  File "stringsource", line 2, in pysam.libcbcf.VariantRecord.__reduce_cython__
TypeError: self.ptr cannot be converted to a Python object for pickling

源代码的相应部分如下所示:

delayed(to_arrow)(vf.fetch(..), ordered_dict)

vf是一个类似于文件的对象,而vf.fetch(..)返回对该文件中存在的记录进行迭代的迭代器(这是一个VCF文件 ,我正在使用pysam库读取它)。 我希望这提供了足够的背景。

来自dask的消息显示迭代发生在函数调用期间而不是函数内部,这使我认为传递迭代器可能dask 所以我用sum(range(..))进行了快速检查,这似乎可行。 现在我很困惑,我想念什么?

为此提供一个最小的工作示例有点困难。 但也许以下有所帮助。

  1. 此处下载VCF文件(及其索引):例如, ALL.chrY*vcf.gz{,.tbi}
  2. pip3 install --user pysam
  3. 打开文件: vf = VariantFile('/path/to/file.vcf.gz', mode='r')
  4. 像这样的迭代器: vf.fetch("Y", 2_600_000, 2_700_000)
  5. 对于延迟功能,您可能会有一个空循环。

简短的答案是:重组延迟的函数,以使文件打开阶段发生该函数内部 ,而您传递了指向该特定文件所需的参数(例如,路径)。

如果您有兴趣,可以看看Dask在内部如何做到这dask.bytes.core.OpenFile ,它是dask.bytes.core.OpenFile类,它是一个可序列化的东西,会延迟打开,直到在with块中使用它为止。 这是一种方便的方法,但是您可以做一些更简单的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM