扩展 sizeof

扩展 sizeof

当 Dask 需要计算对象的字节大小时,例如确定哪些对象要溢写到磁盘,它会使用 dask.sizeof.sizeof 注册机制。需要为其自己的对象定义 sizeof 实现的用户可以使用 sizeof.register

>>> import numpy as np
>>> from dask.sizeof import sizeof
>>> @sizeof.register(np.ndarray)
>>> def sizeof_numpy_like(array):
...     return array.nbytes

可以将此代码放在库的模块中执行,例如 __init__.py,以便向 Dask 注册实现。然而,这会增加这些库开发者的维护负担,并且如果这些库不接受该补丁,则必须在所有工作节点上手动导入。

因此,Dask 还公开了一个分组在 dask.sizeof 下的 入口点 (entrypoint),以使第三方库能够开发和维护这些 sizeof 实现。

对于一个虚构的库 numpy_sizeof_dask.py,所需的 setup.cfg 配置如下

[options.entry_points]
dask.sizeof =
   numpy = numpy_sizeof_dask:sizeof_plugin

numpy_sizeof_dask.py 则包含

>>> import numpy as np
>>> def sizeof_plugin(sizeof):
...    @sizeof.register(np.ndarray)
...    def sizeof_numpy_like(array):
...        return array.nbytes

首次导入 dask.sizeof 时,Dask 会使用 dask.sizeof.sizeof 对象调用入口点 (sizeof_plugin),然后可以使用该对象注册 sizeof 实现。