2011-06-16 15 views
6

मुझे उच्च डेटा (~ 1-2MB) उच्च दर (~ 200-300 एमबी/एस) पर स्टोर करने के लिए एक तरीका चाहिए।
कुछ शोध के बाद मैंने कई विकल्प मिल गया:मैक ओएस एक्स के तहत डिस्क पर अनुक्रमिक डेटा लिखने का सबसे तेज़ तरीका क्या है?

  • aio_write
  • Direct_IO
  • कार्बन फ़ाइल प्रबंधक के PBWriteForkAsync()
  • डिफ़ॉल्ट fwrite(), एक ब्लॉक में लपेटा जाता है और एक NSOperation में GCD के माध्यम से
  • NSData के appendData भेजा
  • ...

यह wiki page लिनक्स के तहत aio_write की स्थिति का वर्णन करता है। जो मुझे नहीं मिला वह मैक ओएस एक्स

एनएसओपरेशन या ब्लॉक्स + जीसीडी गैर-अवरुद्ध आईओ प्राप्त करने के लिए एक तकनीक प्रतीत होता है, जो मुझे मिला नहीं था aio_write की स्थिति के बारे में एक समान पृष्ठ था। इसका उपयोग कई ओपन सोर्स आईओ पुस्तकालयों में किया जाता है (उदाहरण के लिए https://github.com/mikeash/MAAsyncIO)

क्या किसी ऐसी समस्या के साथ कोई उपयुक्त समाधान मिला है?
वर्तमान में मैं PBWriteForkAsync की ओर जाता हूं क्योंकि इसमें कुछ 'ट्यूनिंग' पैरामीटर होते हैं। यह 64-बिट सुरक्षित भी होना चाहिए।

+0

बेंचमार्क से कम बताने का कोई तरीका नहीं है। आप mmap() पर भी विचार कर सकते हैं। – wnoise

+0

मैं निश्चित रूप से उपाय करूँगा। मैं वर्तमान में सभी उपलब्ध विकल्पों की खोज कर रहा हूं। Osx aio_write के तहत –

+2

एक बहुत अच्छा विकल्प नहीं है क्योंकि सिग्नल के अलावा अधिसूचित होने का कोई तरीका नहीं है। और फिर भी, आपको संबंधित उपयोगकर्ता डेटा नहीं मिलता है क्योंकि यह ओएसएक्स में समर्थित नहीं है। मैं सूची से aio_write स्क्रैप करने का सुझाव दूंगा। –

उत्तर

2

मैं बहुत अच्छी तरह से MacOS पता नहीं है, लेकिन मैं यह भी गैर अवरुद्ध विकल्प O_NONBLOCK साथ unistd.h से open और write syscalls कोशिश होगी। reference

+0

धन्यवाद। मुझे O_NONBLOCK नहीं पता था। मुझे O_DIRECT के बारे में पता था (जो ओएस एक्स के तहत उपलब्ध नहीं है)। वर्तमान में मैं एक कस्टम दृष्टिकोण का उपयोग करता हूं जो एमएमएपी और ग्रैंड सेंट्रल डिस्पैच का उपयोग करता है और यह अब तक अच्छा दिखता है।जीसीडी का उपयोग करके मेरा आईओ भी गैर-अवरुद्ध है और एमएमएपी मुझे तेजी से करने के लिए मजबूर कर रहा है, पेज गठबंधन लिखता है। –

1

आप लेखन के लिए unbuffered आई/ओ का उपयोग करना चाहिए, कार्बन में इस F_NOCACHE साथ बीएसडी उपयोग fcntl() में kFSNoCacheBit साथ FSWriteFork() है।

सिस्टम के गैर-अवरुद्ध आईओ का उपयोग करने के बजाय, आप एक कार्यकर्ता थ्रेड को कतार का उपयोग करके अनुक्रमिक रूप से ब्लॉक लिखने पर विचार करना चाहेंगे। यह आपको अधिक नियंत्रण देगा और सरल हो सकता है, खासकर अगर आप कतार की निगरानी करना चाहते हैं यह देखने के लिए कि क्या आप रख रहे हैं या नहीं।

अधिक जानकारी के लिए here देखें।

+0

धन्यवाद। मैंने पहले ही लिंक किए गए ऐप्पल दस्तावेज़ में वर्णित पीबीवाइटफॉर्क्ससिंक के साथ प्रयोग किया है। आश्चर्यजनक रूप से यह FSWriteFork से धीमी थी। आखिर में मैं 2 अनुक्रमिक mmap-ped क्षेत्रों का उपयोग कर समाप्त हो गया। मैं एक क्षेत्र में लिखता हूं जब तक कि यह पूरा न हो जाए। फिर मैं एक जीसीडी पृष्ठभूमि थ्रेड (एक सेमफोर के साथ संरक्षित) पर फ़ाइल को स्विच, विस्तार और पुनः-एमएमपी करता हूं। –

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