[英]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(..))
进行了快速检查,这似乎可行。 现在我很困惑,我想念什么?
为此提供一个最小的工作示例有点困难。 但也许以下有所帮助。
ALL.chrY*vcf.gz{,.tbi}
pip3 install --user pysam
vf = VariantFile('/path/to/file.vcf.gz', mode='r')
vf.fetch("Y", 2_600_000, 2_700_000)
简短的答案是:重组延迟的函数,以使文件打开阶段发生在该函数内部 ,而您传递了指向该特定文件所需的参数(例如,路径)。
如果您有兴趣,可以看看Dask在内部如何做到这dask.bytes.core.OpenFile
,它是dask.bytes.core.OpenFile
类,它是一个可序列化的东西,会延迟打开,直到在with
块中使用它为止。 这是一种方便的方法,但是您可以做一些更简单的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.