تخزين BLOB - أكثر من 100 جيجابايت، أو MySQL، أو SQLite، أو PostgreSQL + Python

StackOverflow https://stackoverflow.com/questions/44372

  •  09-06-2019
  •  | 
  •  

سؤال

لدي فكرة لتطبيق بسيط يقوم بمراقبة مجموعة من المجلدات وفهرسة أي ملفات يجدها.ستسمح لي واجهة المستخدم الرسومية بوضع علامات على الملفات الجديدة بسرعة ونقلها إلى قاعدة بيانات واحدة للتخزين، كما ستوفر آلية سهلة للاستعلام عن قاعدة البيانات حسب العلامة والاسم ونوع الملف والتاريخ.في الوقت الحالي، لدي حوالي 100 جيجابايت من الملفات على محركي أقراص ثابتة قابلين للإزالة، وستكون قاعدة البيانات بهذا الحجم على الأقل.إذا أمكن، أود دعم البحث عن النص الكامل للمستندات الثنائية والنصية المضمنة.سيكون هذا تطبيق مستخدم واحد.

لا أحاول بدء حرب قواعد البيانات، ولكن ما هي قاعدة البيانات مفتوحة المصدر التي ستعمل بشكل أفضل بالنسبة لي؟أنا متأكد تمامًا من أن SQLLite غير مطروحة ولكن قد أكون مخطئًا.

هل كانت مفيدة؟

المحلول

ما زلت أبحث عن هذا الخيار لأحد مشاريعي الخاصة، ولكن كاوتش دي بي قد يكون من المفيد إلقاء نظرة.

نصائح أخرى

لماذا تخزين الملفات في قاعدة البيانات على الإطلاق؟ما عليك سوى تخزين البيانات التعريفية واسم الملف.إذا كنت بحاجة إلى نسخها إلى موقع جديد لسبب ما، فما عليك سوى القيام بذلك كنسخة لنظام الملفات.

بمجرد إزالة محتويات الملف، ستتمكن أي قاعدة بيانات مختصة من التعامل مع البيانات الوصفية لبضع مئات الآلاف من الملفات.

أفضلي هو تخزين المستند مع البيانات الوصفية.أحد الأسباب هو النزاهة في العلاقات.لا يمكنك نقل الملفات أو تعديلها بسهولة دون أن يتم تنفيذ الإجراء بواسطة قاعدة البيانات.أنا متأكد من أنني أستطيع التعامل مع هذه المشكلات ولكنها ليست نظيفة كما أريد، وكانت تجربتي هي أن معظم البائعين يمكنهم التعامل مع كميات هائلة من البيانات الثنائية في قاعدة البيانات هذه الأيام.أعتقد أنني كنت أتساءل عما إذا كان لدى PostgreSQL أو MySQL أي مزايا واضحة في هذه المجالات، فأنا على دراية بـ Oracle في المقام الأول.على أي حال، شكرًا على الرد، إذا عرفت قاعدة البيانات مكان وجود الملف الخارجي، فسيكون من السهل أيضًا إحضار الملف في وقت لاحق إذا أردت ذلك.كان الجانب الآخر من السؤال هو ما إذا كان من الأسهل التعامل مع أي من قاعدتي البيانات عند استخدام Python.أفترض أن هذا غسل.

أكره دائمًا الإجابة بـ "لا تفعل"، ولكن من الأفضل أن تقوم بالفهرسة باستخدام شيء مثل Lucene (بايلوسين).يوصى دائمًا بذلك وتخزين المسارات في قاعدة البيانات بدلاً من محتويات الملف.

للإضافة إلى ذلك، لن يقوم أي من محركات قواعد البيانات هذه بتخزين LOBs في مساحة بيانات منفصلة (سيتم تضمينها في مساحة بيانات الجدول) لذا يجب أن يكون أداء أي من هذه المحركات متساويًا تقريبًا أيضًا (باستثناء sqllite).تحتاج إلى الانتقال إلى Informix أو DB2 أو SQLServer أو غيرها للحصول على هذا النوع من التعامل مع الكائنات الثنائية.

سيعمل أي منها تقريبًا (على الرغم من أنه لم يكن من المفترض استخدام SQLLite في بيئة متزامنة متعددة المستخدمين، مما قد يمثل مشكلة...) لأنك لا تريد فهرسة المحتويات الفعلية للملفات.

العامل المحدد الوحيد هو الحد الأقصى لحجم "الحزمة" لقاعدة البيانات المحددة (بواسطة الحزمة أشير إلى استعلام/استجابة).عادةً ما يكون هذا الحد حوالي 2 ميجابايت، مما يعني أن ملفاتك يجب أن تكون أصغر من 2 ميجابايت.بالطبع يمكنك زيادة هذا الحد، لكن العملية برمتها غير فعالة إلى حد ما، لأنه على سبيل المثال، لإدراج ملف، سيتعين عليك:

  • قراءة الملف بأكمله في الذاكرة
  • تحويل الملف في استعلام (وهو ما يعني عادةً ترميزه السداسي - وبالتالي مضاعفة الحجم من البداية)
  • تنفيذ الاستعلام الذي تم إنشاؤه (والذي يعني في حد ذاته - بالنسبة لقاعدة البيانات - أنه يجب تحليله)

سأستخدم قاعدة بيانات بسيطة والملفات المرتبطة المخزنة باستخدام اصطلاح التسمية مما يسهل العثور عليها (على سبيل المثال بناءً على المفتاح الأساسي).بالطبع هذا التصميم ليس "نقيًا"، لكنه سيكون أداؤه أفضل بكثير كما أنه أسهل في الاستخدام.

لماذا تضيع الوقت في محاكاة شيء يجب أن يكون نظام الملفات قادرًا على التعامل معه؟مزيد من التخزين + grep هو إجابتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top