سؤال

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

إليك نسخة رخيصة التظاهر من التعليمات البرمجية الخاصة بي:

marvelouslibrary.h:

int marvelousfunction(const char *filename);

عادة استخدام الأشخاص.

#include "marvelouslibrary.h"
int somefunction(char *somefilename)
{
    return marvelousfunction(somefilename);
}

myprogram.cpp:

#include "marvelouslibrary.h"
int one_of_my_routines() 
{
    byte* stuff = new byte[1000000];
    // fill stuff[] with...stuff!
    // stuff[] holds same bytes as might be found in a file

    /* magic goes here: make filename referring to stuff[] */

   return marvelousfunction( ??? );
}

لتكون واضحة، لا تقدم MarvelousLibrary أي وظائف API التي تقبل البيانات حسب المؤشر؛ يمكن فقط قراءة ملف فقط.

فكرت في أنابيب و Mkfifo ()، لكنها تبدو مخصصة للتواصل بين العمليات. أنا لا خبير في هذه الأشياء. هل يعمل أنبوب مسمى بخير قراءة مكتوبة في نفس العملية؟ هل هذا نهج حكيم؟

أو تخطي كوني ذكي، انتقل مع الخطة "B" وهو Shuddup وفقط كتابة ملف TEMP. ومع ذلك، أود أن أتعلم شيئا جديدا ومعرفة ما هو ممكن في هذه الحالة، بجانب الحصول على أداء عال.

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

المحلول

بالنظر إلى أنه من المحتمل أن يكون لديك وظيفة مثل:

char *read_data(const char *fileName)

أعتقد أنك سوف تحتاج إلى "تخطي كونها ذكية، انتقل مع الخطة" B "والتي هي shuddup وكتابة ملف TEMP فقط."

إذا كان بإمكانك حفر ومعرفة ما إذا كانت المكالمة التي تقوم بها تدعو دالة أخرى تأخذ ملف * أو int for divercriptor الملف، فيمكنك القيام بشيء أفضل.

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

نصائح أخرى

لست متأكدا من نوع الإدخال الذي تريد وظيفة المكتبة ... هل يحتاج إلى اسم مسار / ملف، أو فتح مؤشر الملفات، أو واصف الملفات المفتوح؟

إذا كنت لا ترغب في اختراق المكتبة وتريد الوظيفة سلسلة (مسار إلى ملف)، فحاول جعل الملف المؤقت في / dev / shm.

خلاف ذلك، قد يكون MMP هو الخيار الأفضل، يرجى التأكد من البحث POSIX_MADVISE () عند استخدام mmap () (أو نظيره posix_fadvise () إذا كنت تستخدم ملف مؤقت).

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

يحرر

آسف، أنا فقط أعد قراءت سؤالك .. ربما قرأت فقط بسرعة كبيرة. لا توجد وسيلة ستغذي وظيفة مثل:

char * foo(const char *filepath)

... مع mmap ().

إذا لم تتمكن من تعديل المكتبة لقبول واصف الملف بدلا من ذلك (أو كبديل للمسار) .. مجرد استخدام / dev / shm وملف مؤقت، سيكون رخيصا جدا.

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

يحرر: آسف. فقط اقرأ السؤال. مع النصائح الخاصة بي أدناه، يمكنك شوكة عملية احتياطية، وسؤال "يفعل في العمل في عملية واحدة لا يأتي". لا أرى أيضا أي سبب لم تستطع تفرخ موضوع منفصل للقيام بالدفع ...


ليس في الأقل أناقة، ولكن يمكنك:

  1. افتح أنبوب مسمى.
  2. شوكة غاسل لا يفعل شيئا سوى محاولة الكتابة إلى الأنبوب
  3. تمرير اسم الأنابيب

والتي ينبغي أن تكون قوية جدا ...

mmap ()، ربما؟

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