4

我想从生成器列表中创建一个dask.Bag(或)。dask.Array问题是生成器(在评估时)对于内存来说太大了。

delayed_array = [delayed(generator) for generator in list_of_generators]
my_bag = db.from_delayed(delayed_array)

注意list_of_generators就是这样 - 发电机还没有被消耗(还)。

我的问题是,在创建delayed_array生成器时会消耗掉并且 RAM 已经耗尽。有没有办法在Bag不首先使用它们的情况下将这些长列表放入其中,或者至少以块的形式使用它们以保持较低的 RAM 使用率?

NNB 我可以将生成器写入磁盘,然后将文件加载到磁盘中Bag- 但我想我可以用它dask来解决这个问题?

4

1 回答 1

4

Dask.bag 的一个不错的子集可以与大型迭代器一起使用。您的解决方案几乎是完美的,但是您需要提供一个函数来在调用时创建您的生成器,而不是生成器本身。

In [1]: import dask.bag as db

In [2]: import dask

In [3]: b = db.from_delayed([dask.delayed(range)(i) for i in [100000000] * 5])

In [4]: b
Out[4]: dask.bag<bag-fro..., npartitions=5>

In [5]: b.take(5)
Out[5]: (0, 1, 2, 3, 4)

In [6]: b.sum()
Out[6]: <dask.bag.core.Item at 0x7f852d8737b8>

In [7]: b.sum().compute()
Out[7]: 24999999750000000

但是,肯定有一些方法可以咬你。一些稍微复杂的 dask bag 操作确实需要使分区具体化,这可能会耗尽 RAM。

于 2018-06-14T17:25:53.243 回答