# 缓存

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

## 指纹

缓存是如何跟踪应用于数据集的转换的？🤗 Datasets 会为缓存文件分配一个指纹（fingerprint）。指纹用于记录数据集的当前状态。初始指纹是通过 Arrow 表的哈希值计算得出的；如果数据集位于磁盘上，则使用 Arrow 文件的哈希值。后续的指纹通过将前一状态的指纹与最新应用的转换的哈希值组合计算得出。

> [!TIP]
> Transforms 是 [How-to Process](./process) 指南中的任何处理方法，例如 [Dataset.map()](/docs/datasets/v5.2.0/zh/package_reference/main_classes#datasets.Dataset.map) 或 [Dataset.shuffle()](/docs/datasets/v5.2.0/zh/package_reference/main_classes#datasets.Dataset.shuffle)。

以下是实际指纹的样子：

```py
>>> 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
```

要使 transform 可哈希，它必须能够通过 [dill](https://dill.readthedocs.io/en/latest/) 或 [pickle](https://docs.python.org/3/library/pickle) 进行序列化。

当使用不可哈希的 transform 时，🤗 Datasets 会使用随机指纹并抛出警告。该不可哈希的 transform 被视为与之前的 transform 不同。因此，🤗 Datasets 将重新计算所有 transform。请确保你的 transform 可以通过 pickle 或 dill 进行序列化，以避免此问题！

🤗 Datasets 重新计算所有内容的一个示例是当缓存被禁用时。在这种情况下，缓存文件会在每次运行时生成，并被写入临时目录。一旦你的 Python 会话结束，临时目录中的缓存文件就会被删除。这些缓存文件会被分配一个随机哈希值，而不是指纹。

> [!TIP]
> 当缓存被禁用时，请使用 [Dataset.save_to_disk()](/docs/datasets/v5.2.0/zh/package_reference/main_classes#datasets.Dataset.save_to_disk) 保存转换后的数据集，否则会话结束后该数据集将被删除。

## 哈希

数据集的指纹通过哈希传递给 `map` 的函数以及 `map` 参数（`batch_size`、`remove_columns` 等）来更新。

您可以使用 [fingerprint.Hasher](/docs/datasets/v5.2.0/zh/package_reference/main_classes#datasets.fingerprint.Hasher) 检查任何 Python 对象的哈希值：

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

哈希值是通过使用 `dill` 序列化器将对象转储，并对转储后的字节进行哈希计算得出的。该序列化器会递归地转储函数中使用的所有变量，因此，只要你对函数中使用的任何对象进行了更改，哈希值就会随之改变。

如果你的某个函数在不同会话中似乎没有相同的哈希值，这意味着它的至少一个变量包含了一个非确定性的 Python 对象。当这种情况发生时，你可以随意对任何可疑对象进行哈希计算，以尝试找出导致哈希值变化的对象。例如，如果你使用了一个元素顺序在不同会话中不确定的列表，那么该列表的哈希值在不同会话中也不会相同。

