2011-08-08 15 views
6

में फ़्लश किया गया है, मेरे पास कुछ बड़ी, बड़ी फ़ाइलें हैं जिनके साथ मैं काम करता हूं और मैं उन्हें एक्सेस करने के लिए कई अलग-अलग I/O फ़ंक्शंस का उपयोग करता हूं। सबसे आम एक bigmemory पैकेज है।यह जांचना कि क्या बफर को आर

फ़ाइलों को लिखते समय, मैंने आउटपुट बफर को फ्लश करने का कठिन तरीका सीखा है, अन्यथा सभी शर्त इस बात से दूर हैं कि डेटा सहेजा गया था या नहीं। हालांकि, इससे कुछ बहुत लंबे इंतजार हो सकते हैं जबकि bigmemory इसकी बात (कई मिनट) करता है। मुझे नहीं पता कि ऐसा क्यों होता है - यह हमेशा नहीं होता है और इसे आसानी से पुन: उत्पन्न नहीं किया जाता है।

क्या यह निर्धारित करने का कोई तरीका है कि आई/ओ बफर आर में विशेष रूप से bigmemory के लिए फ़्लश किए गए हैं या नहीं? यदि ऑपरेटिंग सिस्टम मायने रखता है, तो उस तरह से जवाब को बाधित करने के लिए स्वतंत्र महसूस करें।

यदि उत्तर bigmemory से अधिक सामान्यीकृत किया जा सकता है, तो यह बहुत अच्छा होगा, क्योंकि कभी-कभी मैं अन्य मेमोरी मैपिंग फ़ंक्शंस या I/O स्ट्रीम पर भरोसा करता हूं।

यदि बफरों को फिसलने के लिए जांच करने के लिए कोई अच्छा समाधान नहीं है, तो ऐसे मामले हैं जिनमें यह माना जा सकता है कि बफर फ़्लश किए गए हैं? अर्थात। flush() का उपयोग करने के अलावा।

अद्यतन: मुझे यह स्पष्ट करना चाहिए कि ये सभी बाइनरी कनेक्शन हैं। @RichieCotton ने नोट किया कि isIncomplete(), हालांकि सहायता दस्तावेज़ केवल टेक्स्ट कनेक्शन का उल्लेख करता है। यह स्पष्ट नहीं है कि यह बाइनरी कनेक्शन के लिए उपयोग योग्य है।

+0

'bigmemory' के साथ उपयोग के बारे में निश्चित नहीं है, लेकिन नियमित कनेक्शन के लिए' iscompleple' काम करता है। –

+0

धन्यवाद! कनेक्शन पर बहुत सीमित सहायता जानकारी केवल उल्लेख करती है कि iscompleple टेक्स्ट कनेक्शन के आउटपुट के लिए उपयुक्त है। क्या आपके पास बाइनरी कनेक्शन के साथ भाग्य है? – Iterator

उत्तर

0

मैं आगे अपने ही जवाब डाल देता हूँ, लेकिन मैं कुछ भी है कि स्पष्ट है स्वागत करते हैं।

जो मैंने अभी तक देखा है, विभिन्न कनेक्शन फ़ंक्शन, उदा। file, open, close, flush, isOpen, और isIncomplete (दूसरों के बीच), विशिष्ट कनेक्शन प्रकारों पर आधारित हैं, उदा। फाइलें, पाइप, यूआरएल, और कुछ अन्य चीजें।

इसके विपरीत, bigmemory का अपना कनेक्शन प्रकार है और bigmemory ऑब्जेक्ट एक S4 ऑब्जेक्ट है जो ऑपरेटिंग सिस्टम बफर के लिए मेमोरी एड्रेस के लिए स्लॉट के साथ है। एक बार वहां रखा गया, ओएस उन बफर को फ्लश करने का प्रभारी है। चूंकि यह एक ओएस ज़िम्मेदारी है, फिर "गंदे" बफर पर जानकारी प्राप्त करने के लिए ओएस के साथ बातचीत की आवश्यकता है, आर

इस प्रकार, bigmemory का उत्तर "नहीं" है क्योंकि डेटा कर्नेल बफर में संग्रहीत है, हालांकि यह एसटीडीआईओ (यानी "उपयोगकर्ता स्थान" में संग्रहीत) के माध्यम से संभाले गए अन्य कनेक्शनों के लिए "हां" हो सकता है।

चीजों के ओएस/कर्नेल पक्ष पर अधिक अंतर्दृष्टि के लिए, this question on SO देखें; मैं कुछ कार्यक्रमों की जांच कर रहा हूं (न सिर्फ आर + बिगमेमरी) जो बफर फ्लशिंग जिज्ञासा पैदा कर रहे हैं, और उस धागे ने मुझे चीजों के कर्नेल पक्ष के बारे में जानकारी देने में मदद की।

0

क्या यह और अधिक आश्वस्त है कि incomplete() बाइनरी फ़ाइलों के साथ काम करता है?

# R process 1 
zz <- file("~/test", "wb") 
writeBin(c(1:100000),con=zz) 
close(zz) 

# R process 2 
zz2 <- file("~/test", "rb") 
inpp <- readBin(con=zz2, integer(), 10000) 
while(isIncomplete(con2)) {Sys.sleep(1); inpp <- c(inpp, readBin(zz2),integer(), 10000)} 
close(zz2) 

(सहायता (कनेक्शन) फ़ाइल। से संशोधित)

+0

इसका परीक्षण करने के लिए धन्यवाद। हालांकि, जब तक कि मैं इसे गलत तरीके से पढ़ रहा हूं, आपका उदाहरण केवल इनपुट बफर के मामले में इसका उपयोग करता है।मैं वास्तव में स्पष्ट नहीं हूं कि यह आउटपुट बफर पर काम करता है। मैं यह निर्धारित करने के लिए आउटपुट बफरिंग के साथ पर्याप्त परिचित नहीं हूं कि हम इसका परीक्षण कर सकते हैं या नहीं। मैं प्रलेखन से परे जाने के लिए बस अनिच्छुक हूं - यदि इसका व्यवहार निश्चित रूप से निर्धारक के बजाय यादृच्छिक है, तो मुझे दूषित डेटा का एक गुच्छा जोखिम होता है। मैं उस सड़क से नीचे गया हूं, इसलिए मैं सतर्क हूं। :) – Iterator

+0

आगे परीक्षण के बाद, मुझे नहीं लगता कि 'bigmemory' ऑब्जेक्ट्स के लिए 'अपूर्ण() 'काम करता है: ऐसा लगता है कि ऑब्जेक्ट कनेक्शन के बजाय किसी प्रकार के पॉइंटर्स हैं। :( – Iterator

+0

सुझाव और उदाहरण के लिए धन्यवाद। यह पता चला है कि इस मामले में बफर को आर के बाहर संभाला जाता है। – Iterator