我可以将 `IterableDataset` 转换为 `Dataset` 吗?

Zac*_*she 6 huggingface-datasets

我想加载一个大型数据集,对某些字段应用一些转换,从结果中采样一小部分并存储为文件,以便稍后可以从那里加载。

基本上是这样的:

ds = datasets.load_dataset("XYZ", name="ABC", split="train", streaming=True)
ds = ds.map(_transform_record)
ds.shuffle()[:N].save_to_disk(...)
Run Code Online (Sandbox Code Playgroud)

IterableDataset没有save_to_disk()方法。有意义,因为它由迭代器支持,但是我希望有某种方法将可迭代转换为常规数据集(通过迭代所有数据并将其存储在内存/磁盘中,没有什么太花哨的)。

我尝试使用Dataset.from_generator()并使用IterableDataset作为生成器(iter(ds)),但它不起作用,因为它试图序列化生成器对象。

有没有一种简单的方法,就像to_iterable_dataset()反之亦然?

Hap*_*ace 3

您必须将 \xc2\xa0 IterableDataset\xc2\xa0 缓存到磁盘才能将其加载为 \xc2\xa0 Dataset。一种方法是使用 \xc2\xa0 Dataset.from_generator

\n
from functools import partial\nfrom datasets import Dataset\n\ndef gen_from_iterable_dataset(iterable_ds):\n    yield from iterable_ds\n\nds = Dataset.from_generator(partial(gen_from_iterable_dataset, iterable_ds), features=iterable_ds.features)\n
Run Code Online (Sandbox Code Playgroud)\n\n