2012-06-19 18 views
8

में समानांतर में उन टुकड़ों को पढ़ने मैं एक बहुत बड़ी CSV फ़ाइल (1GB +) है कैसे, यह 100,000 लाइन है।कई टुकड़ों में एक CSV फ़ाइल विभाजित और जावा कोड

मैं एक HTTP अनुरोध भेजने के लिए के लिए एक शरीर बनाने के लिए CSV फ़ाइल से प्रत्येक पंक्ति विभाजित करने एक जावा प्रोग्राम लिखने के लिए की जरूरत है।

दूसरे शब्दों में, मैं 100,000 HTTP अनुरोध जो CSV फ़ाइल में लाइनों के लिए इसी रहे हैं बाहर भेजने की जरूरत है। अगर मैं इन्हें एक थ्रेड में करता हूं तो यह बहुत लंबा होगा।

मैं 1,000 धागे बनाने के लिए मैं) CSV फ़ाइल से एक लाइन पढ़ते हैं, ii) एक HTTP अनुरोध जिनके शरीर पढ़ने लाइन का कन्टैंट शामिल है बनाते हैं, और iii) HTTP अनुरोध भेजने और प्रतिक्रिया प्राप्त करना चाहते हैं।

इस तरह, मैं सीएसवी 1,000 टुकड़ों में फ़ाइल विभाजित करने की आवश्यकता है, और उन टुकड़ों को एक-दूसरे में कोई ओवरलैप लाइनों होना चाहिए।

ऐसी विभाजन प्रक्रिया का सबसे अच्छा तरीका क्या है?

+1

* मैं एक बहुत बड़ी CSV फ़ाइल (1GB +) है, यह आजकल कंप्यूटर यह बिल्कुल बड़ा नहीं है के लिए 100,000 लाइन * है। सीपीयू की तुलना में काफी अधिक धागे होने पर गलती होती है यदि आप सभी सीपीयू को संतृप्त कर सकते हैं। अंत में यह आईओ विभाग में बंधेगा, सर्वर पर समवर्ती अनुरोधों को भी भेजना बहुत बुद्धिमान नहीं है जब तक आप जानबूझकर डीओएस का प्रयास नहीं करते। – bestsss

उत्तर

7

कई स्थानों पर एक एकल फाइल पढ़ना समवर्ती नहीं जाने देंगे आप किसी भी तेजी से जाना (लेकिन यह धीमी गति से कर सकता है आप काफी नीचे)।

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

+0

क्या फ़ाइल को पढ़ने से पहले इसे एक ही आकार में कई हिस्सों में विभाजित करने के लिए एक विभाजन ऑपरेशन करना संभव है? यदि ऐसा है, तो फ़ाइल को विभाजित करने के बाद, समानांतर में भाग पढ़ने के लिए एकाधिक धागे को तारांकित करना एक ही थ्रेड की तुलना में तेज़ होगा, पूरी फ़ाइल को पढ़ता है, है ना? – JuliaLi

+0

@ जुलिआली नहीं, वास्तव में नहीं: बड़ी फ़ाइलें अक्सर डिस्क पर एक-दूसरे के करीब स्थित कई ब्लॉक पर कब्जा करती हैं।चूंकि डिस्क लगातार ब्लॉक तक पहुंचने में बहुत तेज होती हैं क्योंकि चुंबकीय सिर को फिर से स्थानांतरित करने की कोई आवश्यकता नहीं होती है, डिस्क से बड़ी फ़ाइल पढ़ने से लगातार तेज़ी से किया जाता है। – dasblinkenlight

4

आप एक धागा जो सीएसवी की तर्ज पढ़ता है और लाइनों को पढ़ने की एक सूची बनाता है हो सकता है। जब यह कुछ सीमा तक पहुंचता है उदा। एक अनुरोध के रूप में भेजने के लिए इसे एक निश्चित आकार थ्रेड पूल में पास करने के लिए 100 लाइनें।

मैं जब तक आपके सर्वर 1000 कोर होने पर, आप पा सकते हैं कि 10-100 समवर्ती अनुरोधों का उपयोग कर तेजी से होता है संदेह है।

+0

यह इस पर निर्भर करता है कि HTTP प्रतिक्रिया प्राप्त करने में कितना समय लगता है। यदि शामिल सर्वर धीमे हैं, तो अधिकांश धागे I/O की प्रतीक्षा करेंगे। – biziclop

+0

यदि नेटवर्क या सर्वर धीमा है, तो बड़े बैच आकार या अधिक छोटे अनुरोध का उपयोग करके लोड समय में सुधार हो सकता है। यह कहना असंभव है कि इसका परीक्षण किए बिना अनुकूल क्या है। मेरा मुद्दा था; अधिक धागे को बेहतर न मानें। –

+1

यही मेरा मतलब था। चूंकि आपका आवेदन I/O बाध्य होने की अधिक संभावना है, इसलिए कोर की संख्या के आधार पर एक निश्चित सूत्र काम नहीं करेगा, आपको सबसे अच्छा काम करने के साथ प्रयोग करना होगा। (या एक अनुकूली प्रणाली है, जो शायद यह overcomplicating है लिखें।) – biziclop

1

एक धागा लाइन द्वारा फ़ाइल लाइन पढ़ने है और हर पंक्ति पढ़ने के लिए, एक ExecutorService में एक कार्य पोस्ट हर एक के लिए HTTP अनुरोध करने के लिए।

n वें पंक्ति को पढ़ने के लिए, एकाधिक धागे से फ़ाइल को पढ़ने के लिए काम नहीं किया जा रहा है, आपको पहले सभी को पढ़ना होगा। (यह सिद्धांत रूप में काम कर सकता था यदि आपकी फ़ाइल निश्चित चौड़ाई रिकॉर्ड निहित है, लेकिन सीएसवी एक निश्चित चौड़ाई प्रारूप नहीं है।)

+0

जब आप कॉलम जानते हैं तो आप लाइन के अंत का अनुमान लगा सकते हैं, यह करने योग्य है लेकिन प्रयास के लायक नहीं है। तो अगर वहाँ कई डिस्क सारिणी और मैप की गई फ़ाइल से अधिक थ्रेड (पढ़ने भाग के लिए) काम करेगा कर रहे हैं – bestsss

+0

यह फ़ाइल को पढ़ने से पहले यह एक ही आकार में एक से अधिक टुकड़ों में विभाजित करने के लिए एक विभाजन आपरेशन करने के लिए संभव है? यदि ऐसा है, तो फ़ाइल को विभाजित करने के बाद, समानांतर में भाग पढ़ने के लिए एकाधिक धागे को तारांकित करना। – JuliaLi

2

पढ़ें CSV फ़ाइल एक बार आप अपने Runnable Task की वस्तु का निर्माण करके पूल में Thread उपलब्ध से एक के लिए इस लाइन लाइन प्रतिनिधि मिलता है और यह Executors'ssubmit() को गुजरते हैं जो एसिंक्रोनस रूप से निष्पादित किया जाएगा।

public static void main(String[] args) throws IOException { 

     String fName = "C:\\Amit\\abc.csv"; 
     String thisLine; 
     FileInputStream fis = new FileInputStream(fName); 
     DataInputStream myInput = new DataInputStream(fis); 
     ExecutorService pool=Executors.newFixedThreadPool(1000); 
     int count = 0; // Concurrent request to Server barrier 

     while ((thisLine = myInput.readLine()) != null) { 
      if (count > 150) { 
       try { 
        Thread.sleep(100); 
        count = 0; 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

      pool.submit(new MyTask(thisLine)); 
      count++; 
     } 

    } 
} 

यहाँ अपने कार्य:

class MyTask implements Runnable { 
     private String lLine; 
     public MyTask(String line) { 
      this.lLine=line; 

     } 

     public void run() { 
      // 1) Create Request lLine 
      // 2) send the HTTP request out and receive response 
     } 
} 
0

जावा 8, जो इस महीने के प्रदर्शन की योजना है, समानांतर नदियों और lambdas के माध्यम से इस के लिए समर्थन में सुधार हुआ है जाएगा। समानांतर धाराओं पर ओरेकल का tutorial एक अच्छा प्रारंभिक बिंदु हो सकता है।

ध्यान दें कि यहां एक गड़बड़ी बहुत समानांतरता है।यूआरएल को पुनः प्राप्त करने के उदाहरण के लिए, कम संख्या में समांतर कॉल होने की संभावना है। बहुत ज्यादा समानांतरवाद केवल नहीं बैंडविड्थ और वेब साइट आप कनेक्ट कर रहे प्रभावित कर सकते हैं, लेकिन आप भी फ़ाइल वर्णनकर्ता, जो सबसे वातावरण जहां जावा रन में एक सख्ती से सीमित संसाधन है समाप्त हो रहा जोखिम होगा।

कुछ ढांचे जो आपकी मदद कर सकते हैं नेटफ्लिक्स 'RxJava और Akka हैं। ध्यान रखें कि ये ढांचे छोटे नहीं हैं और सीखने के लिए कुछ प्रयास करेंगे।

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