# Önbellek

Önbellek, 🤗 Datasets'in bu kadar verimli olmasının nedenlerinden biridir. Daha önce indirilmiş ve işlenmiş veri setlerini saklar; bunları tekrar kullanmanız gerektiğinde doğrudan önbellekten yeniden yüklenir. Bu sayede bir veri setini baştan indirmek veya işleme fonksiyonlarını yeniden uygulamak gerekmez. Python oturumunu kapatıp yeni bir oturum başlattıktan sonra bile 🤗 Datasets, veri setinizi doğrudan önbellekten yeniden yükler!

## Parmak izi

Önbellek, bir veri setine uygulanan dönüşümleri nasıl takip eder? 🤗 Datasets, önbellek dosyasına bir parmak izi atar. Parmak izi, bir veri setinin mevcut durumunu takip eder. Başlangıç parmak izi, Arrow tablosundan bir özet (hash) veya veri seti diskteyse Arrow dosyalarının özeti kullanılarak hesaplanır. Sonraki parmak izleri, önceki durumun parmak izi ile en son uygulanan dönüşümün özeti birleştirilerek hesaplanır.

> [!TIP]
> Transforms, [How-to Process](./process) kılavuzlarındaki [Dataset.map()](/docs/datasets/main/tr/package_reference/main_classes#datasets.Dataset.map) veya [Dataset.shuffle()](/docs/datasets/main/tr/package_reference/main_classes#datasets.Dataset.shuffle) gibi işleme yöntemlerinden herhangi biridir.

İşte gerçek parmak izlerinin görünümü:

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

Bir dönüştürmenin hashlenebilir olması için [dill](https://dill.readthedocs.io/en/latest/) veya [pickle](https://docs.python.org/3/library/pickle) ile picklenebilir (serileştirilebilir) olması gerekir.

Hash'lenemeyen bir dönüştürme (transform) kullandığınızda, 🤗 Datasets bunun yerine rastgele bir parmak izi (fingerprint) kullanır ve bir uyarı verir. Hash'lenemeyen dönüştürme, önceki dönüştürmelerden farklı olarak kabul edilir. Sonuç olarak 🤗 Datasets tüm dönüştürmeleri yeniden hesaplar. Bunu önlemek için dönüştürmelerinizin pickle veya dill ile serileştirilebilir (serializable) olduğundan emin olun!

🤗 Datasets'in her şeyi yeniden hesapladığı bir örnek, önbellekleştirmenin devre dışı bırakılmasıdır. Bu durumda, önbellek dosyaları her seferinde oluşturulur ve geçici bir dizine yazılır. Python oturumunuz sonlandığında, geçici dizindeki önbellek dosyaları silinir. Bu önbellek dosyalarına, bir parmak izi yerine rastgele bir hash atanır.

> [!TIP]
> Önbellekleme devre dışı bırakıldığında, dönüştürülmüş veri setinizi [Dataset.save_to_disk()](/docs/datasets/main/tr/package_reference/main_classes#datasets.Dataset.save_to_disk) ile kaydedin; aksi takdirde oturum sonlandığında silinir.

## Hashing

Bir veri setinin parmak izi, `map` işlevine geçirilen fonksiyonun ve `map` parametrelerinin (`batch_size`, `remove_columns` vb.) özetlenmesiyle güncellenir.

Herhangi bir Python nesnesinin parmak izini [fingerprint.Hasher](/docs/datasets/main/tr/package_reference/main_classes#datasets.fingerprint.Hasher) kullanarak kontrol edebilirsiniz:

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

Hash, nesnenin `dill` pickler kullanılarak dökülmesi ve dökülen baytların hashlenmesiyle hesaplanır. Pickler, fonksiyonunuzda kullanılan tüm değişkenleri özyinelemeli olarak döker; bu nedenle fonksiyonunuzda kullanılan bir nesnede yaptığınız herhangi bir değişiklik, hash'in değişmesine neden olur.

Eğer fonksiyonlarınızdan birinin oturumlar arasında aynı hash değerine sahip görünmemesi, değişkenlerinden en az birinin deterministik olmayan bir Python nesnesi içerdiği anlamına gelir. Bu durumda, hash değerinin neden değiştiğini bulmak için şüpheli bulduğunuz herhangi bir nesnenin hash'ini alabilirsiniz. Örneğin, elemanlarının sıralaması oturumlar arasında deterministik olmayan bir liste kullanıyorsanız, hash değeri de oturumlar arasında aynı olmayacaktır.

