# Veri kümeleri 🤝 Arrow

## Arrow nedir?

[Arrow](https://arrow.apache.org/), büyük miktardaki verilerin hızlı bir şekilde işlenmesini ve taşınmasını sağlar. Verileri sütun tabanlı bir bellek düzeninde saklayan belirli bir veri biçimidir. Bu, çeşitli önemli avantajlar sunar:

* Arrow'ın standart formatı, [sıfır kopyalı okumaları](https://en.wikipedia.org/wiki/Zero-copy) destekleyerek neredeyse tüm seri hale getirme yükünü ortadan kaldırır.
* Arrow dil bağımsızdır, bu nedenle farklı programlama dillerini destekler.
* Arrow sütun yönelimli olduğundan, veri dilimlerinin veya sütunlarının sorgulanması ve işlenmesi daha hızlıdır.
* Arrow, NumPy, Pandas, PyTorch ve TensorFlow gibi standart makine öğrenimi araçlarına kopyasız devirler yapmanıza olanak tanır.
* Arrow, iç içe geçmiş olabilecek birçok sütun türünü destekler.

## Bellek eşlemesi

🤗 Datasets, yerel önbellekleme sistemi için Arrow kullanır. Bu, veri kümelerinin disk tabanlı bir önbellek tarafından desteklenmesine olanak tanır; bu önbellek hızlı arama için belleğe eşlenir (memory-mapped). Bu mimari, nispeten küçük cihaz belleğine sahip makinelerde büyük veri kümelerinin kullanılmasını sağlar.

Örneğin, tam İngilizce Wikipedia veri setini yüklemek yalnızca birkaç MB RAM gerektirir:

```python
>>> import os; import psutil; import timeit
>>> from datasets import load_dataset

# Process.memory_info is expressed in bytes, so convert to megabytes 
>>> mem_before = psutil.Process(os.getpid()).memory_info().rss / (1024 * 1024)
>>> wiki = load_dataset("wikimedia/wikipedia", "20220301.en", split="train")
>>> mem_after = psutil.Process(os.getpid()).memory_info().rss / (1024 * 1024)

>>> print(f"RAM memory used: {(mem_after - mem_before)} MB")
RAM memory used: 50 MB
```

Bu, Arrow verisinin aslında belleğe yüklenmek yerine diskten bellek eşlemesi (memory-mapped) ile erişilmesinden kaynaklanır. Bellek eşlemesi, diskteki verilere erişimi sağlar ve hızlı aramalar için sanal bellek yeteneklerinden yararlanır.

## Performans

Arrow kullanılarak bellek eşlemeli bir veri seti üzerinde gezinmek hızlıdır. Bir dizüstü bilgisayarda Wikipedia üzerinde gezinme hızı 1-3 Gbit/s'dir:

```python
>>> s = """batch_size = 1000
... for batch in wiki.iter(batch_size):
...     ...
... """

>>> elapsed_time = timeit.timeit(stmt=s, number=1, globals=globals())
>>> print(f"Time to iterate over the {wiki.dataset_size >> 30} GB dataset: {elapsed_time:.1f} sec, "
...       f"ie. {float(wiki.dataset_size >> 27)/elapsed_time:.1f} Gb/s")
Time to iterate over the 18 GB dataset: 31.8 sec, ie. 4.8 Gb/s
```

