Datasets documentation

مجموعات البيانات 🤝 Arrow

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v4.8.4).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

مجموعات البيانات 🤝 Arrow

ما هو Arrow؟

يتيح Arrow معالجة كميات كبيرة من البيانات ونقلها بسرعة. وهو تنسيق بيانات محدد يخزّن البيانات في تخطيط ذاكرة أعمدي. ويوفر ذلك عدة مزايا جوهرية:

  • يتيح التنسيق القياسي لـ Arrow قراءات بدون نسخ مما يُزيل تقريبًا كل أعباء التسلسل.
  • تتميز Arrow بأنها غير مرتبطة بلغة برمجية محددة، لذا فهي تدعم لغات برمجة مختلفة.
  • يعتمد Arrow على التوجيه العمودي، مما يجعله أسرع في الاستعلام ومعالجة شرائح البيانات أو أعمدتها.
  • يتيح Arrow تسليم البيانات دون نسخ إلى أدوات التعلم الآلي القياسية مثل NumPy وPandas وPyTorch وTensorFlow.
  • يدعم Arrow أنواع أعمدة متعددة، قد تكون متداخلة.

تعيين الذاكرة

🤗 يستخدم Datasets تقنية Arrow لنظام التخزين المؤقت المحلي. ويتيح ذلك الاعتماد على ذاكرة تخزين مؤقت على القرص، مع استخدام خرائط الذاكرة (memory-mapping) للبحث السريع. تسمح هذه البنية باستخدام مجموعات بيانات كبيرة على أجهزة ذات ذاكرة جهاز صغيرة نسبيًا.

على سبيل المثال، لا يستغرق تحميل مجموعة بيانات ويكيبيديا الإنجليزية الكاملة سوى بضعة ميغابايتات من ذاكرة الوصول العشوائي:

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

يكون ذلك ممكنًا لأن بيانات Arrow تُخزَّن فعليًا عبر خرائط الذاكرة من القرص، ولا تُحمَّل في الذاكرة. ويتيح خرائط الذاكرة الوصول إلى البيانات المخزنة على القرص، مع الاستفادة من قدرات الذاكرة الافتراضية للبحث السريع.

الأداء

يُعدّ التكرار على مجموعة بيانات مرسومة في الذاكرة باستخدام Arrow سريعاً. فعند التكرار على ويكيبيديا على حاسوب محمول، تحصل على سرعات تتراوح بين 1 و3 غيغابت/ثانية:

>>> 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
Update on GitHub