Datasets 文档
缓存
并获得增强的文档体验
开始使用
缓存
缓存是 🤗 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
为了使转换可哈希,它需要能被 dill 或 pickle 进行序列化。
当您使用一个不可哈希的转换时,🤗 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 上更新