मैं जल्दी कैसे काट और पासा बड़े डेटा फ़ाइलों करते हैं?


5

मैं बड़े डाटाफाइलों काट करने के लिए और पासा, एक गिग अप करने के लिए एक काफी त्वरित और कुशल तरीके से करना चाहते हैं। अगर मैं यूनिक्स के "क्यूट" जैसे कुछ का उपयोग करता हूं, तो यह बहुत तेज है, यहां तक ​​कि एक CYGWIN पर्यावरण में भी।

मैं विकसित करने और इन फ़ाइलों की प्रक्रिया, और हमेशा हिमनदों परिणामों के साथ समाप्त करने के लिए विभिन्न रूबी लिपियों बेंचमार्किंग कोशिश की है।

आप रूबी में क्या करें यह सुनिश्चित करने के लिए तो कुत्ते को धीमा नहीं होगा?

1

क्यों उन्हें एक साथ गठबंधन नहीं - क्या यह गोंद/मूल्य कट से परिणामों के साथ जोड़ने के प्रदान करने के लिए सबसे अच्छा और गहरे लाल रंग का होता है ऐसा करने के लिए कटौती का उपयोग कर?

puts `cut somefile > foo.fil` 
# process each line of the output from cut 
f = File.new("foo.fil") 
f.each{|line| 
} 
+1

बजाय एक अस्थायी फ़ाइल के लिए लिख, आप कर सकते हैं: आप इस तरह बैकटिक में उन्हें रख कर शेल स्क्रिप्ट चला सकते हैं पाइप = IO.popen ("कट ..."); पाइप.एच_लाइन {| लाइन | ...} 29 jul. 092009-07-29 16:22:34


2

यह सवाल मुझे टिम ब्रे के Wide Finder project की याद दिलाता है। सबसे तेजी से जिस तरह से वह रूबी का उपयोग कर एक अपाचे लॉगफ़ाइल पढ़ सकते हैं और यह पता लगाने की जो लेख दिलवाया गया है सबसे इस स्क्रिप्ट के साथ था सकता है:

counts = {} 
counts.default = 0 

ARGF.each_line do |line| 
    if line =~ %r{GET /ongoing/When/\d\d\dx/(\d\d\d\d/\d\d/\d\d/[^ .]+) } 
    counts[$1] += 1 
    end 
end 

keys_by_count = counts.keys.sort { |a, b| counts[b] <=> counts[a] } 
keys_by_count[0 .. 9].each do |key| 
    puts "#{counts[key]}: #{key}" 
end 

यह इस कोड CPU के 7½ सेकण्ड लगे, 13 सेकंड गुजर चुके है, इस प्रक्रिया के लिए पिछले साल के 1.67 गीगा पावरबुक पर एक मिलियन और रिकॉर्ड रिकॉर्ड, एक क्वार्टर-गीग या तो।


1

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

मेरा सुझाव: जितना संभव हो सके छोटे पेजिंग या बैकट्रैकिंग के साथ प्रसंस्करण करने की कोशिश करें।


0

मुझे संदेह है कि समस्या यह है कि रूबी पूरी फाइल को स्मृति में पढ़ रहा है। सत्यापित करने के लिए आदेश चलाते समय स्मृति और डिस्क उपयोग को देखें।

मुझे लगता है कि मुख्य कारण यह है कि कट सी में लिखा गया है और केवल एक चीज कर रहा है, इसलिए इसे शायद बहुत धातु में संकलित किया गया है। यह शायद सिस्टम कॉल को कॉल करने से कहीं ज्यादा नहीं कर रहा है।

हालांकि रूबी संस्करण कई चीजें एक साथ कर रहा है। सी फ़ंक्शन कॉल की तुलना में रूबी में एक विधि को कॉल करना बहुत धीमा है।

बुढ़ापे याद रखें और यूनिक्स में युवाओं और कौशल को हरा trechery: http://ridiculousfish.com/blog/archives/2006/05/30/old-age-and-treachery/