Datasets documentation
Dataset 🤝 Arrow
Dataset 🤝 Arrow
Apa itu Arrow?
Arrow memungkinkan pemrosesan dan perpindahan data dalam jumlah besar dengan cepat. Ini adalah format data spesifik yang menyimpan data dalam tata letak memori kolom. Hal ini memberikan beberapa keuntungan signifikan:
- Format standar Arrow memungkinkan zero-copy reads yang menghilangkan hampir semua overhead serialisasi.
- Arrow bersifat tidak bergantung pada bahasa pemrograman sehingga mendukung berbagai bahasa pemrograman.
- Arrow berorientasi kolom sehingga lebih cepat dalam melakukan kueri dan memproses potongan atau kolom data.
- Arrow memungkinkan hand-off tanpa salin ke alat machine learning standar seperti NumPy, Pandas, PyTorch, dan TensorFlow.
- Arrow mendukung banyak tipe kolom, yang mungkin bersarang.
Pemetaan memori
🤗 Datasets menggunakan Arrow untuk sistem cache lokalnya. Hal ini memungkinkan dataset didukung oleh cache di disk, yang dipetakan ke memori (memory-mapped) untuk pencarian yang cepat. Arsitektur ini memungkinkan penggunaan dataset besar pada mesin dengan memori perangkat yang relatif kecil.
Sebagai contoh, memuat dataset Wikipedia bahasa Inggris lengkap hanya membutuhkan beberapa MB RAM:
>>> 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 MBHal ini dimungkinkan karena data Arrow sebenarnya di-memory-map dari disk, dan tidak dimuat ke dalam memori. Memory-mapping memungkinkan akses ke data di disk, dan memanfaatkan kemampuan virtual memory untuk pencarian yang cepat.
Kinerja
Iterasi pada dataset memory-mapped menggunakan Arrow sangat cepat. Iterasi pada Wikipedia di laptop memberikan kecepatan 1-3 Gbit/s:
>>> 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