الوحدة 5 — التخزين المؤقّت للبيانات والموارد
بعد الوحدات الأربع الأولى، أصبح لدينا تطبيق يعرض جداول ورسوم. المشكلة: كلّ نقرة تُعيد قراءة ملفّ CSV، وتُعيد تحميل النموذج، وتُعيد كلّ حساب سابق. تطبيق يستغرق أربع ثوانٍ لكلّ تفاعل غير قابل للاستعمال. حلّ Streamlit مزخرف بديكوريتَين: @st.cache_data و@st.cache_resource. الفرق بينهما ليس تفصيلًا: إساءة استعمال أحدهما بمكان الآخر مصدر أخطاء صامتة تُلوّث حالة التطبيق. هذه الوحدة تُوضّح متى وأيّهما.
القاعدة الحاسمة
@st.cache_data: لكلّ ما يُعتبَر بيانات (إطارات، قواميس، قوائم، نتائج حسابيّة). Streamlit يحفظ نسخة، ويُعيدها في كلّ استدعاء بالوسائط نفسها. الكائن المُعاد جديد في كلّ مرّة (يُنسَخ فعلًا).@st.cache_resource: لكلّ ما هو مورد مشترك لا يجب نسخه (نموذج مُحمَّل، اتّصال قاعدة بيانات، عميل API). Streamlit يحفظ إشارة إلى الكائن نفسه، ويُعيدها لجميع الجلسات.
الاختلاف الجوهريّ: cache_data ينسخ، cache_resource لا ينسخ. الآثار العمليّة كثيرة.
متى تختار كلًّا منهما
اختر cache_data إن كنت تُريد: قراءة ملفّ CSV، استفسار قاعدة بيانات، حساب تجميع بـpandas، نتيجة استدعاء API يمكن تسلسلها. كلّ هذا بيانات يمكن حفظها ونسخها.
اختر cache_resource إن كنت تُريد: تحميل نموذج scikit-learn أو PyTorch أو TensorFlow، فتح اتّصال بـPostgres أو Redis، إنشاء عميل OpenAI. كلّ هذا موارد تُشارَك بلا نسخ.
قاعدة الشكّ: إذا كان الشيء ثقيلًا في الذاكرة (نموذج ضخم) أو له حالة داخليّة (اتّصال)، فهو cache_resource. إذا كان قيمة يمكن كتابتها في ملفّ (jsonable, picklable) وتُقرأ منه، فهو cache_data.