2017-11-18 34 views
6

मेरे पास एक बड़ी टेक्स्ट फ़ाइल (475,000,000 लाइनें) हैं। मैं इसे पढ़ने के बिना फ़ाइल में पंक्तियों की संख्या जल्दी से प्राप्त करना चाहता हूं।पूरी फ़ाइल को पढ़ने के बिना फ्रेड से पंक्तियों की संख्या निकालें

data.table से fread वास्तव में काफी तेजी से (~ 10 सेकंड) इससे पहले पूरे फ़ाइल को पढ़ने के लिए आगे बढ़ता पंक्ति संख्या के साथ आता है:

fread('D:/text_file.txt',select=1,colClasses="character") 
Read 7.1% of 472933221 rows #number of rows appears after 10 seconds 

पूरे पढ़ने के बिना इस पंक्ति संख्या को निकालने के लिए एक रास्ता है बाद में फ़ाइल? रिकॉर्ड के लिए, पूरी फ़ाइल को पढ़ने में 36 सेकंड लगते हैं।

मैंने countLinesR.utils से कोशिश की है लेकिन इसमें 53 सेकंड लगते हैं। अंतर यह हो सकता है कि fread में केवल एक कॉलम चुनने का विकल्प है और countLines सब कुछ पढ़ता है।

R.utils::countLines("D:/text_file.txt") #53 seconds 

मैं भी इस तरह के रूप में अन्य विंडोज तरीकों की कोशिश की है:

find /v /c "" "D:\text_file.txt" #takes 1 minute 50 seconds 
grep "^" D:\text_file.txt | wc -l #takes 2 minutes 

कार्य करते हैं, लेकिन वे के रूप में तेजी से fread के रूप में नहीं कर रहे हैं। मैं विंडोज़ पर हूं

+4

कोशिश 'विंडोज Rtools में WC -l filename' पाया। –

+1

क्या आपने सी में एक छोटा सा फ़ंक्शन लिखने का प्रयास किया था? यह बहुत आसान है और तेजी से होना चाहिए। – nicola

+0

@ जी Grothendieck धन्यवाद आप एक आकर्षण की तरह काम करता है। इसे चलाने में 8 सेकंड लगते हैं: 'खोल (' wc.exe -l "डी: /text_file.txt" ', intern = TRUE) ' –

उत्तर

5

@ डीबी ने मुझसे अपने प्रश्न का विस्तृत उत्तर देने के लिए कहा। @ जी के रूप में Grothendieck ने सुझाव दिया, जवाब wc का उपयोग करना है, जो Rtools का हिस्सा है, जो माइक्रोसॉफ्ट विंडोज के तहत आर के लिए पैकेज बनाने के लिए संसाधनों का संग्रह है।

एक बार इंस्टॉल हो जाने पर, सुनिश्चित करें कि C:\Rtools\bin आपके PATH में विंडोज़ में पर्यावरण चर में है।

फिर, wcsystem या shell का उपयोग कर अनुसंधान करने के लिए उपलब्ध हो जाता है:

shell('wc -l "D:/text_file.txt"',intern =TRUE) 
संबंधित मुद्दे