Datasets documentation
ذاكرة التخزين المؤقت
ذاكرة التخزين المؤقت
يُعدّ الكاش أحد الأسباب التي تجعل 🤗 Datasets فعّالاً للغاية. فهو يخزّن مجموعات البيانات التي تم تنزيلها ومعالجتها مسبقاً، بحيث عند الحاجة إلى استخدامها مرة أخرى، يتم تحميلها مباشرة من الكاش. وهذا يتجنّب الحاجة إلى تنزيل مجموعة بيانات من جديد، أو إعادة تطبيق دوال المعالجة. وحتى بعد إغلاق جلسة Python وبدء جلسة أخرى، سيعيد 🤗 Datasets تحميل مجموعة بياناتك مباشرة من الكاش!
بصمة
كيف يتتبع الكاش التحويلات المطبقة على مجموعة البيانات؟ ببساطة، يخصص 🤗 Datasets بصمة (fingerprint) لملف الكاش. تحافظ البصمة على تتبع الحالة الحالية لمجموعة البيانات. تُحسب البصمة الأولية باستخدام تجزئة (hash) من جدول Arrow، أو تجزئة لملفات Arrow إذا كانت مجموعة البيانات على القرص. أما البصمات اللاحقة فتُحسب عن طريق دمج بصمة الحالة السابقة مع تجزئة آخر تحويل تم تطبيقه.
تحويلات (Transforms) هي أي من طرق المعالجة الواردة في أدلة كيفية المعالجة مثل Dataset.map() أو Dataset.shuffle().
إليك شكل البصمات الفعلية:
>>> 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لكي تكون التحويلة قابلة للتجزئة (hashable)، يجب أن تكون قابلة للتسلسل (picklable) بواسطة dill أو pickle.
عند استخدام تحويل غير قابل للتجزئة (non-hashable)، يستخدم 🤗 Datasets بصمة عشوائية بدلاً من ذلك ويصدر تحذيراً. يُعتبر التحويل غير القابل للتجزئة مختلفاً عن التحويلات السابقة. ونتيجةً لذلك، سيعيد 🤗 Datasets حساب جميع التحويلات. تأكد من أن تحويلاتك قابلة للتسلسل باستخدام pickle أو dill لتجنب ذلك!
مثال على إعادة حساب 🤗 Datasets لكل شيء هو عند تعطيل التخزين المؤقت. عند حدوث ذلك، يتم توليد ملفات التخزين المؤقت في كل مرة وتُكتب في مجلد مؤقت. بمجرد انتهاء جلسة Python الخاصة بك، تُحذف ملفات التخزين المؤقت الموجودة في المجلد المؤقت. يُسند إلى هذه الملفات تجزئة عشوائية بدلاً من البصمة.
عند تعطيل التخزين المؤقت، استخدم Dataset.save_to_disk() لحفظ مجموعة البيانات المحوّلة، وإلا فسيتم حذفها عند انتهاء الجلسة.
التجزئة
يتم تحديث بصمة مجموعة البيانات عن طريق تجزئة الدالة المُمرَّرة إلى map وكذلك معاملات map (batch_size، remove_columns، وما إلى ذلك).
يمكنك التحقق من البصمة (hash) لأي كائن بايثون باستخدام fingerprint.Hasher:
>>> from datasets.fingerprint import Hasher
>>> my_func = lambda example: {"length": len(example["text"])}
>>> print(Hasher.hash(my_func))
'3d35e2b3e94c81d6'يتم حساب البصمة (hash) عن طريق تفريغ الكائن باستخدام مُفرِّغ dill ثم أخذ بصمة البايتات المُفرَّغة.
يُفرِّغ المُفرِّغ (pickler) بشكل تكراري جميع المتغيرات المستخدمة في دالتك، لذا فإن أي تغيير تجريه على كائن مستخدم في دالتك سيؤدي إلى تغيير البصمة.
إذا بدا أن إحدى دوالك لا تملك نفس البصمة التجزئة (hash) عبر الجلسات، فهذا يعني أن متغيرًا واحدًا على الأقل من متغيراتها يحتوي على كائن بايثون غير حتمي. عند حدوث ذلك، لا تتردد في حساب البصمة التجزئة لأي كائن يبدو لك مشبوهًا لمحاولة إيجاد الكائن الذي تسبب في تغيّر البصمة. على سبيل المثال، إذا كنت تستخدم قائمة (list) لا يكون ترتيب عناصرها حتميًا عبر الجلسات، فلن تكون البصمة التجزئة هي نفسها عبر الجلسات أيضًا.
Update on GitHub