Datasets 文档
缓存
并获得增强的文档体验
开始使用
缓存
缓存是 🤗 Datasets 如此高效的原因之一。它存储了之前下载和处理过的数据集,因此当你需要再次使用它们时,可以直接从缓存中重新加载。这避免了必须重新下载数据集或重新应用处理函数。即使在你关闭并启动另一个 Python 会话后,🤗 Datasets 仍将直接从缓存中重新加载你的数据集!
指纹 (Fingerprint)
缓存如何跟踪数据集应用了哪些转换(transforms)?🤗 Datasets 为缓存文件分配了一个“指纹”。指纹用于跟踪数据集的当前状态。初始指纹是使用 Arrow 表的哈希值计算的,如果数据集在磁盘上,则使用 Arrow 文件的哈希值。随后的指纹是通过将前一状态的指纹与最新应用转换的哈希值相结合而计算得出的。
转换是指 如何处理 (How-to Process) 指南中的任何处理方法,例如 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为了使转换可哈希,它需要能够被 dill 或 pickle 序列化(picklable)。
当你使用不可哈希的转换时,🤗 Datasets 会使用一个随机指纹并发出警告。不可哈希的转换被认为与之前的转换不同。因此,🤗 Datasets 将重新计算所有转换。请确保你的转换可以通过 pickle 或 dill 序列化,以避免这种情况!
🤗 Datasets 重新计算所有内容的一个例子是禁用缓存时。在这种情况下,每次都会生成缓存文件并将其写入临时目录。一旦你的 Python 会话结束,临时目录中的缓存文件将被删除。这些缓存文件将被分配一个随机哈希值,而不是指纹。
当禁用缓存时,请使用 Dataset.save_to_disk() 来保存你转换后的数据集,否则它将在会话结束时被删除。
哈希 (Hashing)
数据集的指纹是通过对传递给 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 转储(dump)对象并对转储的字节进行哈希。pickler 会递归地转储函数中使用的所有变量,因此你对函数中使用的对象所做的任何更改都将导致哈希值发生变化。
如果你的某个函数在不同会话之间的哈希值似乎不一致,这意味着其变量中至少包含一个非确定性的 Python 对象。在这种情况下,你可以尝试哈希任何你认为可疑的对象,以找出导致哈希值变化的根源。例如,如果你使用了一个在不同会话中元素顺序不确定的列表,那么其哈希值在不同会话之间也不会相同。
在 GitHub 上更新