2013-02-07 9 views
5

मेरे पास विंडोज़ पर सी ++ में दो निष्पादन योग्य हैं। मैं एक में कुछ डेटा उत्पन्न करता हूं, और इस डेटा को संसाधित करने के लिए अन्य निष्पादन योग्य को कॉल करना चाहता हूं। मैं डेटा को फ़ाइल में लिख सकता हूं और इसे अन्य निष्पादन योग्य में पढ़ सकता हूं, लेकिन यह डिस्क I/O के संदर्भ में महंगा लगता है। ऐसा करने का एक बेहतर तरीका क्या है? यह एक साधारण पर्याप्त सवाल की तरह लगता है लेकिन गूगल सिर्फ मदद नहीं कर रहा है!एक्जिक्यूटिव के बीच डेटा स्थानांतरित करना

मान लें कि डेटा लगभग 100 एमबी है, और भेजने की आवश्यकता से पहले पूरी तरह से उत्पन्न होता है (यानी कोई स्ट्रीमिंग आवश्यक नहीं है)।

जवाब जो 32 बिट और 64 बिट प्रक्रियाओं को मिलाते समय काम करते हैं, बोनस अंक प्राप्त करते हैं।

+3

नामित पाइप, स्थानीय winsockets, मेमोरी मैप की गई फ़ाइलें, साझा स्मृति, मेल स्लॉट, रजिस्ट्री, खिड़की संदेश (बड़े डेटा के लिए अच्छा नहीं), और क्या? अपना चयन ले लो। यदि आप हमें डेटा (आकार, इत्यादि) और जिस प्रकृति को डेटा साझा करना चाहते हैं, उसके बारे में हमें कुछ और बताते हैं, तो हम बेहतर सलाह दे सकते हैं कि कौन सी विधि सर्वोत्तम है। – thang

+1

सामान्यतः, इसे [इंटर-प्रोसेस संचार] कहा जाता है (http://en.wikipedia.org/wiki/Inter-process_communication)। – Oswald

+0

निश्चित रूप से, मैंने डेटा के बारे में थोड़ी सी जानकारी जोड़ दी है। मूल रूप से मैंने अभी "बड़ी राशि" लिखी है लेकिन पोस्ट करने से पहले मेरे प्रश्न को संपादित किया है, मुझे वास्तव में कुछ संख्याएं दी जानी चाहिए :) –

उत्तर

4

यदि आपकी प्रक्रियाएं आसानी से फ़ाइल से लिख और पढ़ी जा सकती हैं, तो बस आगे बढ़ें। CreateFile के साथ फ़ाइल बनाएं और इसे अस्थायी & साझा करने योग्य के रूप में चिह्नित करें। विंडोज भौतिक लिखने में देरी के लिए इस संकेत का उपयोग करता है, लेकिन सभी फाइल अर्थशास्त्र अभी भी पालन किया जाता है। चूंकि आपकी फ़ाइल केवल 100 एमबी है और सक्रिय रूप से उपयोग में है, विंडोज लगभग निश्चित रूप से रैम में अपनी सामग्री को रखने में सक्षम है।

+0

ठीक है, मुझे नहीं पता था कि इस तरह की कैशिंग इस भरोसेमंद थी। निश्चित रूप से सबसे सरल समाधान, धन्यवाद :) –

3

आप Boost.MPI का उपयोग कर सकते हैं। यह बूस्ट, जो उच्च गुणवत्ता मानक है से है, और कोड नमूने बहुत स्पष्ट लगता है:

http://www.boost.org/doc/libs/1_53_0/doc/html/mpi/tutorial.html#mpi.point_to_point

// The following program uses two MPI processes to write "Hello, world!" 
// to the screen (hello_world.cpp): 

int main(int argc, char* argv[]) 
{ 
    mpi::environment env(argc, argv); 
    mpi::communicator world; 

    if (world.rank() == 0) { 
    world.send(1, 0, std::string("Hello")); 
    std::string msg; 
    world.recv(1, 1, msg); 
    std::cout << msg << "!" << std::endl; 
    } else { 
    std::string msg; 
    world.recv(0, 0, msg); 
    std::cout << msg << ", "; 
    std::cout.flush(); 
    world.send(0, 1, std::string("world")); 
    } 
    return 0; 
} 
+0

बूस्ट कभी मुझे आश्चर्यचकित नहीं करता! यह एक अच्छा विकल्प प्रतीत होता है, खासकर अगर मैं इसे एकाधिक मशीनों पर काम करने के लिए बढ़ाता हूं, लेकिन अब के लिए मैं फाइल कैशिंग पर भरोसा करने के सरल विकल्प के साथ जाऊंगा क्योंकि एमएसल्टर्स सुझाव देते हैं। –

1

मान लिया जाये कि आप केवल जाने के लिए "एक दिशा" चाहते हैं (जो है, आप की जरूरत नहीं है बाल प्रक्रिया से डेटा वापस पाने के लिए), आप _popen() का उपयोग कर सकते हैं। आप पाइप पर अपना डेटा लिखते हैं और बच्चे की प्रक्रिया stdin से डेटा पढ़ती है।

यदि आपको डेटा के द्विपक्षीय प्रवाह की आवश्यकता है, तो आपको दो पाइप, इनपुट के रूप में एक और आउटपुट के रूप में उपयोग करने की आवश्यकता होगी, और आपको एक प्रक्रिया स्थापित करने की आवश्यकता होगी कि बाल प्रक्रिया उन पाइपों से कैसे जुड़ती है [आप कर सकते हैं अभी भी डेटा पथ होने के लिए stdin/stdout सेट अप करें, लेकिन आप नामित पाइप की एक जोड़ी भी उपयोग कर सकते हैं]।

एक तीसरा विकल्प shared memory क्षेत्र है। मैंने विंडोज़ में ऐसा कभी नहीं किया है, लेकिन सिद्धांत जो मैंने लिनक्स में उपयोग किया है [और कई साल पहले ओएस/2 में]: 1. आपके माता-पिता में किसी दिए गए नाम के साथ मेमोरी क्षेत्र बनाएं प्रक्रिया। 2. बाल प्रक्रिया एक ही स्मृति क्षेत्र खोलती है। 3. डेटा मूल प्रक्रिया द्वारा संग्रहीत किया जाता है और बाल प्रक्रिया द्वारा पढ़ा जाता है। 4. यदि आवश्यक हो, तो समापन/परिणाम तैयार/आदि को सिग्नल करने के लिए सेमफोर या इसी तरह का उपयोग किया जा सकता है।

+1

मैंने कुछ नया सीखा है :) धन्यवाद! पाइप्स एक अच्छे विकल्प की तरह लगते हैं लेकिन मुझे लगता है कि साझा मेमोरी का मतलब साझा पता स्थान है, जो 32 और 64 बिट प्रक्रियाओं को मिलाते समय काम नहीं करेगा। –

+0

जैसा कि मैंने कोशिश नहीं की है, मुझे नहीं पता, लेकिन जब तक आप नामित साझा मेमोरी का उपयोग करते हैं, तब तक मुझे विश्वास है, और 32-बिट की पता सीमा से अधिक नहीं है [2 जीबी से कम], इसे काम करना चाहिए। बस अपनी साझा स्मृति के भीतर पॉइंटर्स डालना याद रखें। स्मृति एक ही पते पर साझा नहीं है (जरूरी)। –

+0

आह ठीक है, मैंने कोड नमूना गलत समझा। हां, ऐसा लगता है कि यह इस तरह से काम करता है। धन्यवाद x2! –

संबंधित मुद्दे