数据集文档

缓存

Hugging Face's logo
加入 Hugging Face 社区

并获得增强文档体验的访问权限

开始

缓存

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

指纹

缓存如何跟踪应用于数据集的转换? 好吧,🤗 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_sizeremove_columns 等)进行哈希来更新。

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

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

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

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

< > 在 GitHub 上更新