سؤال

ما هي الطريقة الأكثر فعالية لتخزين صفائف كبيرة (10000x100) في قاعدة بيانات، على سبيل المثال، hsqldb؟أحتاج إلى القيام بذلك لبرنامج رياضي معين أكتبه بلغة جافا.الرجاء المساعدة.سيتم استرداد المصفوفة بأكملها وتخزينها كثيرًا (وليس الكثير من العناصر الفردية).أيضًا، يجب تخزين بعض البيانات الوصفية حول المصفوفة.

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

المحلول

والسؤال الكبير.

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

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

واعتمادا على ما هي أنواع البيانات التي تستخدمها، يجب أن تكون قادرة على تحويل مجموعة الخاص بك إلى XML أو ثنائي ثم قم بحفظ هذا إلى حقل واحد في قاعدة البيانات. هل يمكن أن تبدأ مع هذه التقنية في جافا عن طريق التحقق من HTTP: //java.sun. كوم / المطور / technicalArticles / البرمجة / التسلسل / . وأنا أعلم أنه هو صلب .NET.

ونأمل أن يساعد هذا. اسمحوا لي أن أعرف ما إذا كنت يمكن أن تعطيك أي اتجاه أكثر من ذلك.

نصائح أخرى

وماذا عن تخزين البيانات على BLOB وباستخدام جافا لفك BLOB في صفيف جافا الفعلية؟ فإنه سيكون أكثر كفاءة بكثير لتخزين واسترجاع مجموعة كاملة في جرعة واحدة، ولكن سيكون فظيعا بالنسبة twiddling العناصر الفردية.

والخروج مع تمثيل داخلي - سواء كان ذلك XML، JSON، بعض الملفات الثنائية التي تأتي مع نفسك، أو أي شكل آخر من أشكال التسلسل

وتخزينها في جدول باستخدام "فقاعة" نوع البيانات. تخزين أي بيانات التعريف المرتبطة مصفوفة في أعمدة إضافية.

وأنا أختلف بشدة أن طريقة للقيام بذلك هي لإنشاء جدول مع نفس عدد الصفوف والأعمدة مثل المصفوفة الخاصة بك - وهذا هو سعر مرتفع جدا لدفع ثمن الوظائف التي لا تستخدم

وإعداد بك إدراج / تحديد البيانات مسبقا، واستخدام متغيرات ربط لتغيير ما مصفوفة كنت تعمل مع - لا تجعل إعادة التوزيع ديسيبل كل طلب

إذا به هو فقط 1 مجموعة، لماذا لا تستخدم ملف ثنائي؟

وكما allready قد اقترح: لا تستخدم RDBMS إذا كنت لا تحتاج إلى الميزات. بدلا من التسلسل على الرغم من أنك قد ترغب في concider على API مستوى منخفض مثل JDBM أن يوفر بعض قواعد البيانات مثل ميزات مثل إدارة فهرس على القرص.

إذا حزمت البيانات ذات الكثافة (الرسم البياني القيم بالقرب خط ثابت)، والخيار الأفضل هو سائل والتسلسل باستخدام كائن [الإخراج / الإدخال] تيار.

وخلاف ذلك، قد تجد أنه أكثر كفاءة في استخدام المصفوفات متناثر والاختلاف من مخطط الكيان السمة ذات القيمة. هنا مثال:

 Name | IndexKey  | Value
------+-----------+-------
 foo  | 'default' | 39        
 foo  | 0:0:0     | 23
 foo  | 0:0:1     | 34
 foo  | 1:5:0     | 12
 ...
 bar  | 1:3:8     | 20
 bar  | 1:3:8     | 23
 bar  | 1:1:1     | 24
 bar  | 3:0:6     | 54
 ...

وهذا أيضا يسمح لك تحديثات سريعة لأجزاء من الجدول وشرائح اختيار باستخدام SQL 'مثل' المشغل.

إذا تم إصلاح عدد الأبعاد لكسر عمود المفتاح لفصل الأعمدة كثافة العمليات لكل بعد من أجل تحسين كفاءة مؤشر ولها معايير اختيار أكثر مرونة (يمكنك استخدام الفهرس الأول "لاغية" للبيانات الوصفية مثل القيمة الافتراضية).

في أي حال، انها فكرة جيدة لإنشاء فهرس متفاوت المسافات على اسم، والأعمدة IndexKey.

وتحديد جدول مع البيانات يحمل مجموعة وإدراج قيم مجموعة في جدول.

وهذا هو بسيط جدا الوصول إلى البيانات / التخزين. سوف أبعاد الصفيف الخاص بك أن يكون نفسه دائما؟

  • افعل ذلك في صفقة واحدة كبيرة وصريحة.لا تجبر نظام قاعدة البيانات على إنشاء معاملة ضمنية جديدة لكل عملية إدراج.
  • استخدام بيان معد.

وقد بنيت في كيو الدعم للصفائف.

http://www.postgresql.org/docs/8.0/interactive /arrays.html

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

وHSQLDB 2.0 يدعم واحد صفائف الأبعاد المخزنة كعمود من الجدول. لذلك كل صف من الجدول سوف تتوافق مع صف واحد من مجموعة 2D.

ولكن إذا كنت ترغب في إستعادة مجموعة 2D ككل، BLOB هو الحل الأفضل.

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