يبدأ استيراد ملف CSV ثم ينقطع البرنامج عند الصف 18,400 بسبب إعادة تشغيل أو نفاد مساحة مؤقتة. إذا أعاد الفريق الملف كاملاً فقد يكرر ما سبق، وإذا تخطى عدداً تقديرياً من الصفوف فقد يفقد سجلاً. يقترح مشروع تخرج هندسة البرمجيات مستورداً يقسم الملف إلى دفعات، ويحفظ معرف المصدر ورقم آخر دفعة مكتملة داخل SQLite. الفكرة لا تدعي التعامل مع كل ملف ضخم أو قاعدة موزعة؛ تركّز على استئناف واضح لملف ثابت. وهذا يجعله نطاقاً عملياً لمشاريع تخرج هندسة البرمجيات التي تتناول استيراد البيانات واستعادتها.
ابدأ بمصدر يمكن تعريفه
قبل القراءة، احسب بصمة الملف وحجمه وتاريخ آخر تعديل، ثم اربط سجل الاستيراد بالبصمة لا باسم الملف وحده. تغيير المحتوى مع بقاء الاسم يجب أن يبدأ عملية جديدة أو يطلب قراراً. استخدم قارئ CSV يدعم الاقتباس والفواصل داخل الحقول وفق مكتبة موثوقة؛ توثيق وحدة csv في Python يبين أن صيغة الملف لها dialect وأن السطر ليس دائماً سجلاً مفصولاً بفواصل بسيطة.
حدد الترميز، أسماء الأعمدة المتوقعة، وطريقة التعامل مع سطر العناوين. لا تقسّم الملف عند كل سطر newline بعملية نصية إذا كان الحقل المقتبس قد يحتوي newline. يمكن أن تحسب أرقام الصفوف المنطقية من reader، وتحفظ sample صغيراً من الأخطاء بعد تنقيح البيانات. حد حجم الحقل وعدد الأخطاء الظاهرة حتى لا تملأ الذاكرة أو واجهة التقرير بمدخل عدائي أو غير صالح.
اجعل الدفعة وعلامتها معاملة واحدة
يخزن النظام سجلات الدفعة ثم يرفع قيمة checkpoint داخل المعاملة نفسها. إذا انقطع قبل COMMIT، ينبغي ألا يرى الاستئناف سجلات جزئية مع مؤشر متقدم. توضح وثائق SQLite أن تغييرات المعاملة ذرية في الظروف التي يدعمها نظام التخزين، بينما يشرح مرجع المعاملات حدود BEGIN وCOMMIT وROLLBACK وسلوك الأخطاء. يجب أن يختبر المشروع مكتبة الربط وإعداد journal mode المستخدمين فعلياً.
هيئ جداول imports وrows مع مفتاح فريد يجمع source hash ورقم سجل أو معرف عمل. عندما يعيد التطبيق دفعة بعد توقف، يمنع المفتاح الفريد إدراج الصف نفسه مرتين. لا تعتمد على رقم الصف وحده إذا كان ترتيب الملف قد تغير؛ لذلك اربطه بالبصمة وبإصدار parser. احفظ آخر رقم سجل مكتمل فقط بعد نجاح إدراج كل صفوف المجموعة أو تسجيل أخطائها وفق السياسة المتفق عليها.
مثال استيراد 10 آلاف سجل
اختر حجم دفعة تعليمي مثل 500 صف. يحتوي ملف اصطناعي 10,000 صف، فينتج 20 دفعة. إذا وقع الفشل بعد حفظ الدفعة 12، يجب أن يظهر التقرير أن 6,000 صف معالجة، ثم يبدأ التشغيل من الدفعة 13 مع نفس file hash. الأعداد اختيرت لشرح الحساب لا لوصف سرعة مكتبة. جرّب ملفاً فيه اقتباس غير مغلق وصفاً ناقص الحقول، وقرر هل توقف الاستيراد كله أم تحفظ الدفعات السابقة وتضع سجل خطأ.
افصل الصف المقبول عن الصف المرفوض، واحتفظ بسبب الرفض وسياق محدود. إذا اختيرت سياسة «أكمل مع أخطاء»، لا تحرك checkpoint بطريقة تخفي صفوفاً لم تعالج. ينبغي أن يستطيع المستخدم تنزيل قائمة أخطاء منقحة ومطابقة عدد الصفوف: المقروء = المقبول + المرفوض + غير المعالج. أظهر هذه المصالحة، لأنها تساعد على اكتشاف أخطاء عدّ أو صفوف سقطت بين التحويل والحفظ.
أعد التشغيل عند كل حد انقطاع
أنشئ نقطة حقن فشل بعد القراءة وقبل الكتابة، في منتصف إدراج الدفعة، وبعد COMMIT وقبل عرض النتيجة، وبعد حفظ checkpoint. عند كل توقف أعد فتح قاعدة الاختبار وشغّل importer من البداية. يجب ألا تتضاعف الصفوف، وألا يتقدم المؤشر على دفعة لم تكتمل. أفصل الاختبارات التي تقتل العملية عن استثناء عادي؛ فـSIGKILL أو إعادة تشغيل الحاوية قد تكشف مساراً لا يظهر عند catch.
جرب امتلاء القرص أو SQLITE_BUSY، ووقت إيقاف العملية، وملفاً تغيرت بصمته بين جلستين. وثائق SQLite تشير إلى أن بعض أخطاء القرص أو الذاكرة قد تجعل نتيجة المعاملة بحاجة إلى rollback صريح؛ لذلك تحقق من حالة المعاملة بعد الخطأ. الاستئناف لا يصلح تلف القرص ولا يعد بمتانة إذا سحب نظام التشغيل الكتابة أو عمل الملف على مشاركة شبكة غير مدعومة.
قِس الصحة قبل السرعة
حدد أولاً شروط القبول: كل صف له نتيجة واحدة، إعادة التشغيل تكرر النتيجة نفسها، وإكمال ملف لم يتغير يعلن أن الاستيراد مكتمل دون إدخال زائد. بعد ذلك قس زمن القراءة والكتابة لكل دفعة والذاكرة القصوى على أحجام معلنة. قارن دفعات 100 و500 و2,000 مثلاً على الجهاز نفسه مع تكرار كافٍ، ولا تحول نتيجة جهاز الطالب إلى توصية عامة.
تأكد أن transaction لا تحتفظ بقفل كتابة مدة الملف كاملاً إذا كان ذلك يعطل تجربة المستخدم؛ الدفعات تقسم مدة القفل لكن تزيد عدد commits. اختيار الحجم مفاضلة يشرحها المشروع. احتفظ بنسخة baseline تستورد الملف كله في معاملة واحدة، ثم قارن صعوبة الاستئناف وكلفة حفظ checkpoint. لا تقارن حلولاً إذا كانت إحداها تتجاهل الصفوف الخاطئة والأخرى تسجلها.
مخرجات مشروع التخرج
يسلم الفريق parser موثقاً، قاعدة اختبار، توليد CSV اصطناعي، نقطة استئناف، اختبارات فشل، وتقرير reconciliation يوضح المقبول والمرفوض والمتبقي. يمكن ضبط النطاق في مشاريع التخرج وخدمة قواعد البيانات. لا ترفع ملفات المستخدم إلى خادم سحابي في النسخة التعليمية، ولا تترك قيم الصفوف داخل logs. إذا كان الملف يحوي بيانات شخصية، يحتاج النظام إلى سياسة وصول واحتفاظ منفصلة.
هذه الفكرة تختلف عن ترحيل مخطط قاعدة بيانات؛ نقطة العمل فيها سجل بيانات مصدر يتوقف ويستأنف، لا تغيير أعمدة نظام قائم. راجع أيضاً مسار تحليل CSV باستخدام Python لبناء عينة وتحليلها، بينما يركز المستورد هنا على عدم فقد السجل عند الانقطاع. وضوح حدود الملف والمعاملة وparser أهم من وعد تسويقي بأنه «يدعم أي ملف».
المصادر
مراجعة المصادر: .
اختبار المثال وحدوده
كل صفوف CSV وأعداد الدفعات المذكورة أمثلة اصطناعية؛ لا تستند إلى أداء مقاس أو ملف مستخدم.
مقالات ذات صلة
الخدمة المرتبطة: تطوير قواعد البيانات وواجهات البرمجة.
أرسل متطلبات مشروعك