数据集文档

缓存

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

缓存

缓存是 🤗 Datasets 如此高效的原因之一。它存储之前下载和处理的数据集,因此当您需要再次使用它们时,可以直接从缓存重新加载。这避免了重新下载数据集或重新应用处理函数。即使在您关闭并启动另一个 Python 会话后,🤗 Datasets 也会直接从缓存重新加载您的数据集!

指纹

缓存如何跟踪应用于数据集的转换?实际上,🤗 Datasets 为缓存文件分配了一个指纹。指纹跟踪数据集的当前状态。初始指纹是使用 Arrow 表的哈希值计算的,如果数据集在磁盘上,则使用 Arrow 文件的哈希值计算。后续的指纹通过组合先前状态的指纹和应用的最新转换的哈希值来计算。

转换是操作指南 - 处理中的任何处理方法,例如 Dataset.map()Dataset.shuffle()

以下是实际指纹的样子

>>> from datasets import Dataset
>>> dataset1 = Dataset.from_dict({"a": [0, 1, 2]})
>>> dataset2 = dataset1.map(lambda x: {"a": x["a"] + 1})
>>> print(dataset1._fingerprint, dataset2._fingerprint)
d19493523d95e2dc 5b86abacd4b42434

为了使转换可哈希,它需要能够被 dillpickle 序列化。

当您使用不可哈希的转换时,🤗 Datasets 会使用随机指纹并发出警告。不可哈希的转换被认为与之前的转换不同。因此,🤗 Datasets 将重新计算所有转换。确保您的转换可以使用 pickle 或 dill 序列化,以避免这种情况!

禁用缓存时,🤗 Datasets 重新计算所有内容的示例情况。发生这种情况时,缓存文件每次都会生成,并写入临时目录。一旦您的 Python 会话结束,临时目录中的缓存文件将被删除。随机哈希值将分配给这些缓存文件,而不是指纹。

禁用缓存时,请使用 Dataset.save_to_disk() 保存您转换后的数据集,否则它将在会话结束后被删除。

哈希

数据集的指纹通过哈希传递给 map 的函数以及 map 参数 (batch_size, remove_columns 等) 来更新。

您可以使用 fingerprint.Hasher 检查任何 Python 对象的哈希值

>>> from datasets.fingerprint import Hasher
>>> my_func = lambda example: {"length": len(example["text"])}
>>> print(Hasher.hash(my_func))
'3d35e2b3e94c81d6'

哈希值是通过使用 dill pickler 转储对象并哈希转储的字节来计算的。pickler 递归地转储您的函数中使用的所有变量,因此您对函数中使用的对象所做的任何更改都会导致哈希值发生变化。

如果您的某个函数在不同会话中似乎没有相同的哈希值,则意味着其至少一个变量包含一个不确定的 Python 对象。发生这种情况时,请随意哈希您认为可疑的任何对象,以尝试找到导致哈希值更改的对象。例如,如果您使用列表,但其元素的顺序在不同会话中是不确定的,那么哈希值在不同会话中也不会相同。

< > 在 GitHub 上更新