سؤال

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

أنا لست مدربًا على نظام التشغيل أو CS، ولكن من الناحية النظرية يبدو أنه من الممكن إنشاء inode جديد ونسخ بنية مؤشر inode من inode للملفات التي أرغب في النسخ منها، ثم إلغاء ربط تلك inodes.هل هناك أي فائدة من شأنها أن تفعل هذا؟نظرًا لكثرة أدوات يونكس المدروسة جيدًا، كنت أتوقع ذلك تمامًا، لكن لم أتمكن من العثور على أي شيء.ومن هنا سؤالي على SO.يوجد نظام الملفات على جهاز كتلة، وهو في الواقع قرص ثابت، في حالة أهمية هذه المعلومات.ليس لدي الثقة لكتابة هذا بنفسي، حيث أنني لم أقم بأي برمجة على مستوى الأنظمة من قبل، لذا فإن أي مؤشرات (إلى مقتطفات كود C/Python) ستكون مفيدة للغاية.

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

المحلول

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

إذا كنت تتحكم في كيفية كتابة البيانات في الملفات المؤقتة، فستتمكن من ذلك يعرفكم سيكون حجم كل واحدة، يمكنك بدلاً من ذلك القيام بما يلي

  1. قبل بدء المعالجة المتعددة ، قم بإنشاء ملف الإخراج النهائي ، وقم بتنميته إلى الحجم النهائيfseek()حتى النهاية ، سيؤدي ذلك إلى إنشاء ملفملف متفرق.

  2. ابدأ المعالجة المتعددة ، وتسليم كل عملية FD والإزاحة في شريحة الملف الخاصة به.

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

يحرر

إذا لم تتمكن من التنبؤ بحجم الملفات الفردية ، ولكن يمكن للمستهلك للملف النهائي أن يعمل مع إدخال متسلسل (على عكس الوصول العشوائي) ، يمكنك التغذية cat tmpfile1 .. tmpfileN للمستهلك، إما على stdin

cat tmpfile1 ... tmpfileN | consumer

أو عبر الأنابيب المسماة (باستخدام عملية استبدال bash):

consumer <(cat tmpfile1 ... tmpfileN)

نصائح أخرى

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

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

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

لا أعتقد ذلك ، فقد تتم محاذاة inode ، لذلك قد يكون من الممكن فقط إذا كنت موافقًا على ترك بعض الأصفار (أو وحدات البايت غير المعروفة) بين تذييل ملف ورأس ملف آخر.

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

تعديل

san: كما تقول الرمز المستخدم لا يمكنك التحكم فيه ، حسنًا ، يمكنك ربط الملفات المنفصلة سريعًا باستخدام الأنابيب المسماة: Genacodicetagpre

لـ 4 ملفات ؛xaa ، xab ، xac ، xad تسلسل سريع في bash (كجذر):

Genacodicetagpre

(لنفترض أن loop0، loop1، loop2، loop3 هي أسماء ملفات الجهاز الجديدة.)

ضع http://pastebin.com/PtEDQH7G في ملف نصي "Join_us".ثم يمكنك استخدامه على النحو التالي: Genacodicetagpre

بعد ذلك (إذا كان هذا الملف الكبير عبارة عن فيلم) ، يمكنك منح ملكيته لمستخدم عادي (chown itsme / dev / mapper / Join) وبعد ذلك يمكنه تشغيله عبر: mplayer / dev / mapper / Join

التنظيف بعد ذلك (كجذر): Genacodicetagpre

لا ، لا توجد مثل هذه الأداة أو طلب syscall.

يمكنك التحقق مما إذا كان من الممكن لكل عملية الكتابة مباشرة في الملف النهائي.لنفترض أن العملية 1 تكتب بايت 0-X ، وتكتب العملية 2 X-2X وما إلى ذلك.

يتمثل أحد البدائل المحتملة في تجميع كل ملفاتك المؤقتة في أنبوب مسمى ثم استخدام ذلك الأنبوب المسمى كمدخل لبرنامج الإدخال الفردي.طالما أن برنامج الإدخال الفردي يقرأ الإدخال بشكل تسلسلي ولا يسعى.

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