2011-08-21 9 views
5

तो मैं कोशिश की है:बूस्ट एएसओ सॉकेट: हार्ड ड्राइव से फ़ाइल पढ़ने का सबसे तेज़ तरीका?

int buff_length = 8192; 
ifstream stream; 
char* buffer = new char[buff_length]; 

stream.open(path.string().c_str(), ios::binary); 

boost::system::error_code ignored_error; 

while (stream) 
{ 
    stream.read(buffer, buff_length); 
    boost::asio::write(*socket, boost::asio::buffer(buffer, stream.gcount()), 
          boost::asio::transfer_all(), ignored_error); 
} 

मुझे आश्चर्य है कि आप इसे कैसे करते हैं - कैसे यह तेजी से करना है?

मेरा ऐप विंडोज, लिनक्स और मैक ओएस में काम करेगा। यही कारण है कि मैं बूस्ट अलॉट का उपयोग करता हूं। मैं परीक्षण के लिए ab का उपयोग करता हूं। मैं फ़ाइलों को पढ़ने और भेजने पर 2 या कम से कम 1.5 गुना तेजी से प्राप्त करना चाहता हूं। बूस्ट हो सकता है :: Iostream मुझे किसी भी तरह मदद कर सकता है?

+0

एक समय में आप कितनी फाइलें भेजते हैं (एक के बाद एक)? आपकी फाइलें आम तौर पर कितनी बड़ी हैं? –

उत्तर

0

यदि आप ऑप्टिमाइज़ करने का प्रयास कर रहे हैं तो सॉकेट में डिस्क से फ़ाइल भेजना है, तो यदि आप लिनक्स पर हैं तो sendfile(2) देखें। यह विशेष रूप से इस उद्देश्य के लिए बनाया गया है।

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

+1

'sendfile' के समतुल्य विंडोज़ ['TransmitFile'] है (http://msdn.microsoft.com/en-us/library/ms740565%28v=VS.85%29.aspx) – Hasturkun

+0

मैकओएसएक्स पर प्रेषक उपलब्ध है? – Rella

+0

@ कंबंबस: हाँ, ओएस एक्स पर sendfile उपलब्ध है: http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/sendfile.2.html –

0

बढ़ावा :: asio पहले से ही TransmitFile लपेटा गया है, निम्न example

+1

ध्यान दें कि यह उदाहरण विंडोज विशिष्ट है –

1

नहीं पूरी तरह से यकीन है कि क्या आप के बाद कर रहे हैं, लेकिन फाइलों आप स्मृति में फ़ाइल मैप कर सकते हैं के तेजी से पढ़ने के बारे में अपने सवाल का जवाब देने।

इस तरह से आप डिस्क से बजाय स्मृति से पढ़ते हैं। फ़ाइल आकार के आधार पर और ऐसे कई अलग-अलग दृष्टिकोण हैं जो दिलचस्प हो सकते हैं, उदा। फ़ाइल भर में फाइल के छोटे या नक्शा क्षेत्र को भरने पर पूरी फ़ाइल को मैप करें, अगर आप इसे बड़ी फाइल करते हैं तो इसे संसाधित करते हैं।

Boost.Interprocess में आप इस here के बारे में अधिक पढ़ सकते हैं।

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