سؤال

عندما استخدمت numpy ، قمت بتخزين بياناتها بالتنسيق الأصلي *.npy. إنه سريع جدًا وأعطاني بعض الفوائد ، مثل هذا

  • يمكن أن أقرأ *.npy من رمز C كبيانات ثنائية بسيطة (أعني *.npy هي متوافقة مع الهياكل C)

الآن أنا أتعامل مع HDF5 (Pytables في هذه اللحظة). عندما أقرأ في البرنامج التعليمي ، يستخدمون Numpy Serializer لتخزين بيانات numpy ، حتى أتمكن من قراءة هذه البيانات من C اعتبارًا من ملفات Simple *.npy؟

هل HDF5's Numpy عبارة عن ثنائية مع بنية C أيضًا؟

UPD:

لديّ عميل MATLAB يقرأ من HDF5 ، لكن لا أريد قراءة HDF5 من C ++ لأن قراءة البيانات الثنائية من *.npy هي أوقات أسرع ، لذلك لدي حاجة حقًا في قراءة HDF5 من C ++ (التوافق الثنائي) لذلك أنا بالفعل باستخدام طريقتين لنقل البيانات - *.npy (اقرأ من C ++ كبحن ، من Python أصلاً) لإيجاد طريقة لجعل HDF5 ثنائية التكافؤ مع هياكل C ++ ، PLS مساعدة ، إذا كانت هناك طريقة ما لضغطها في HDF5 أو أي شيء آخر لصنع HDF5 ثنائية التكافؤ مع هياكل C ++-أخبرني أين يمكنني أن أقرأ عنها ...

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

المحلول

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

إذا كنت في "التحكم" في إنشاء الملف (وكتابة البيانات - حتى لو كنت تستخدم واجهة برمجة التطبيقات) ، فيجب أن تكون قادرًا على التحايل بالكامل على مكتبات HDF5.

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

لحل مشكلتي ، كتبت محلل ملف HDF5 باستخدام مواصفات الملف http://www.hdfgroup.org/hdf5/doc/h5.format.html

مع محلل بسيط إلى حد ما ، يجب أن تكون قادرًا على تحديد الإزاحة إلى (وحجم) أي مجموعة بيانات. عند هذه النقطة ، ببساطة Fseek و Fread (في C ، وهذا هو ، ربما هناك نهج مستوى أعلى يمكنك اتخاذه في C ++).

إذا تم قطع مجموعات البيانات الخاصة بك ، فسيكون المزيد من التحليل ضروريًا لاجتياز الأشجار B المستخدمة لتنظيم القطع.

القضية الأخرى الوحيدة التي يجب أن تكون على دراية بها هي التعامل مع أي (أو القضاء) أي حشوة هيكل تعتمد على النظام.

نصائح أخرى

الطريقة المناسبة لقراءة ملفات HDF5 من C هي استخدام API HDF5 - انظر هذا الدورة التعليمية. من حيث المبدأ ، من الممكن قراءة البيانات الأولية مباشرة من ملف HDF5 كما تفعل مع ملف .npy ، على افتراض أنك لم تستخدم خيارات التخزين المتقدمة مثل الضغط في ملف HDF5 الخاص بك. ومع ذلك ، فإن هذا يتحدى بشكل أساسي النقطة الكاملة لاستخدام تنسيق HDF5 ولا يمكنني التفكير في أي ميزة للقيام بذلك بدلاً من استخدام API HDF5 المناسبة. لاحظ أيضًا أن واجهة برمجة التطبيقات تحتوي على ملف نسخة مبسطة عالية المستوى والتي يجب أن تجعل القراءة من C غير مؤلمة نسبيا.

HDF5 يعتني بالتوافق الثنائي للهياكل لك. عليك ببساطة أن تخبرها بما تتكون من بنياتك من (DTYPE) ولن تواجه أي مشاكل في توفير/قراءة صفيفات سجلات - وهذا لأن نظام النوع هو أساسًا 1: 1 بين Numpy و HDF5. إذا كنت تستخدم H5py ، فأنا واثق من القول إن IO يجب أن تكون سريعة بما فيه الكفاية شريطة أن تستخدم جميع الأنواع الأصلية والقراءات/الكتابة الكبيرة - مجموعة البيانات بأكملها المسموح بها. بعد ذلك يعتمد ذلك على التضخيم وما هي المرشحات (خلط ورق اللعب ، الضغط على سبيل المثال) - تجدر الإشارة أيضًا إلى أن هذه يمكن أن تسرع في بعض الأحيان عن طريق تقليل حجم الملف بشكل كبير ، لذا انظر دائمًا إلى المعايير. لاحظ أنه يتم إجراء خيارات النوع والمرشح في النهاية إنشاء مستند HDF5.

إذا كنت تحاول تحليل HDF5 بنفسك ، فأنت تفعل ذلك بشكل خاطئ. استخدم واجهات برمجة التطبيقات C ++ و C إذا كنت تعمل في C ++/C. هناك أمثلة على ما يسمى "أنواع المركبات" على موقع مجموعات HDF5.

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