2013-08-26 5 views
7

मैं बहुत बड़ी फ़ाइलों को पढ़ने के प्रयास में data.table (1.8.8, R 3.0.1) में फ़्रेड का उपयोग कर रहा हूं।फ़्रेड सुरक्षा स्टैक ओवरफ़्लो त्रुटि

प्रश्नों में फ़ाइल में 313 पंक्तियां और संख्यात्मक डेटा पंक्तियों के ~ 6.6 मिलियन कोल हैं और फ़ाइल लगभग 12 जीबी है। यह 512 जीबी रैम के साथ एक केंद्र 6.4 है।

जब मैं फ़ाइल में पढ़ने के लिए प्रयास:

g=fread('final.results',header=T,sep=' ') 
'header' changed by user from 'auto' to TRUE 
Error: protect(): protection stack overflow 

मैं --max-ppsize 500000 है, जो अधिकतम है, लेकिन एक ही त्रुटि के साथ आर शुरू करने की कोशिश की।

मैं भी

ulimit -s unlimited 

आभासी स्मृति के माध्यम से असीमित करने के लिए ढेर आकार सेट पहले से असीमित करने के लिए स्थापित किया गया था की कोशिश की।

क्या मैं इस आकार की फ़ाइल के साथ अवास्तविक हूं? क्या मुझे कुछ स्पष्ट याद आया?

+0

कृपया आर-फोर्ज (डेटा.table मुखपृष्ठ पर लिंक) पर v1.8.9 आज़माएं। वहां 'फ्रेड' करने के लिए 10 बग फिक्स हैं, समाचार देखें। बड़े फ़ाइल समर्थन उनमें से एक है, लेकिन विंडोज़ पर पहले से ही लिनक्स पर ठीक होना चाहिए। 6.6 मिलियन कॉलम (!) नया है और अच्छी तरह से एक नई बग हो सकता है। कृपया v1.8.9 के साथ पुष्टि करें और हम वहां से चले जाएंगे ... –

+0

@ मैथ्यूडॉवल हाँ मैं 6 मिलियन पंक्तियों से खुश नहीं हूं। 1.8.9 इंस्टॉल करें, एक ही त्रुटि। मैंने एक बहुत छोटी फाइल बनाई, 10 पंक्तियां x 50 के कोल, एक ही त्रुटि। 10 पंक्तियों x 49,999 कोल यह काम करता है। – mpmorley

+1

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

उत्तर

6

अब आर-फोर्ज पर v1.8.9 में तय किया गया है।

  • एक अनायास ही 50,000 स्तंभ सीमा fread में हटा दिया गया है। रिपोर्टिंग के लिए mpmorley के लिए धन्यवाद। टेस्ट जोड़ा गया।

    // ********************************************************************* 
    // Allocate columns for known nrow 
    // ********************************************************************* 
    ans=PROTECT(allocVector(VECSXP,ncol)); 
    protecti++; 
    setAttrib(ans,R_NamesSymbol,names); 
    for (i=0; i<ncol; i++) { 
        thistype = TypeSxp[ type[i] ]; 
        thiscol = PROTECT(allocVector(thistype,nrow)); // ** HERE ** 
        protecti++; 
        if (type[i]==SXP_INT64) 
         setAttrib(thiscol, R_ClassSymbol, ScalarString(mkChar("integer64"))); 
        SET_TRUELENGTH(thiscol, nrow); 
        SET_VECTOR_ELT(ans,i,thiscol); 
    } 
    

    R-exts section 5.9.1 के अनुसार, कि पाश अंदर की रक्षा की जरूरत नहीं है:

    कुछ

कारण मैं इस हिस्से fread.c स्रोत में गलत था मामलों को वास्तव में आवश्यक सुरक्षा के लिए बेहतर ट्रैक रखना आवश्यक है। बनें विशेष रूप से परिस्थितियों के बारे में जानते हैं जहां बड़ी संख्या में ऑब्जेक्ट उत्पन्न होते हैं। सूचक सुरक्षा ढेर के पास एक निश्चित आकार (डिफ़ॉल्ट 10,000) है और पूर्ण हो सकता है। यह का एक अच्छा विचार नहीं है, फिर बस दृष्टि में सबकुछ सुरक्षित करें और अंत में कई हजार वस्तुओं को अनवरोधित करें। यह ऑब्जेक्ट को अन्य ऑब्जेक्ट (जो स्वचालित रूप से उनकी सुरक्षा करता है) के रूप में ऑब्जेक्ट असाइन करने के लिए लगभग हमेशा संभव होगा या उपयोग के तुरंत बाद उन्हें असुरक्षित कर देगा।

ताकि सुरक्षा अब हटा दी गई हो और सब ठीक है। (ऐसा लगता है कि उस पाठ को लिखा गया था क्योंकि पॉइंटर सुरक्षा स्टैक सीमा को 50,000 तक घटा दिया गया है; Defn.h में #define R_PPSSIZE 50000L है।) मैंने डेटाटेबल सी स्रोत में अन्य सभी प्रोटेक्ट्स की जांच की है, जो कुछ भी समान और पाए गए हैं और निर्दिष्ट किए गए हैं .c भी (संदर्भ द्वारा 50,000 से अधिक कॉलम जोड़ते समय), कोई अन्य नहीं।

रिपोर्टिंग के लिए धन्यवाद!

+0

313 पंक्तियों और 653629 9 कोल्स की एक फ़ाइल के साथ परीक्षण किया गया। 'system.time (Geno <-fread ('final.results' सितम्बर = '', हेडर = TRUE))' ' उपयोगकर्ता प्रणाली elapsed' ' 881.321 16.594 923.957' – mpmorley

+0

@mpmorley बढ़िया है, परीक्षण के लिए धन्यवाद। एक 12 जीबी फ़ाइल पढ़ने के लिए 15 मिनट ठीक लगता है, शायद, यह इतना चौड़ा है। क्या यह तुम्हारे लिए सही है? क्या कुछ और इसे तेजी से पढ़ता है? 'Verbose = TRUE' द्वारा रिपोर्ट किए गए समय के टूटने को देखने में रुचि होगी। यदि यह ज्यादातर उदाहरण के लिए mmap'ing खर्च किया जाता है, तो ट्यून करने के लिए और विकल्प हो सकते हैं। –

+0

मेरे लिए यह स्वीकार्य है, मैं इस डेटा के साथ कुछ उपयोगी करने पर ध्यान केंद्रित नहीं कर रहा हूं, एक नई पोस्ट देख सकता हूं। हालांकि, यदि आप और अन्य रुचि रखते हैं तो मुझे दौड़ने और पोस्ट करने में खुशी होती है। – mpmorley

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