2011-11-14 12 views
12

में बड़ी सीएसवी फाइलों को संसाधित करने के लिए सर्वश्रेष्ठ रणनीति मैं एक मार्ग विकसित करना चाहता हूं जो सीएसवी फाइलों वाली निर्देशिका का चुनाव करे, और प्रत्येक फाइल के लिए यह प्रत्येक पंक्ति को बिन्डी का उपयोग करके अनमशल करता है और इसे सक्रिय एमक्यू में कतार देता है।अपाचे कैमल

समस्या यह है कि फाइलें बहुत बड़ी हो सकती हैं (दस लाख पंक्तियां) इसलिए मैं एक समय में एक पंक्ति कतार करना पसंद करूंगा, लेकिन मुझे जो कुछ मिल रहा है वह जावा में सभी पंक्तियां हैं .util.ArrayList अंत में बिंडी का जो स्मृति समस्याओं का कारण बनता है।

अभी तक मेरे पास थोड़ा परीक्षण है और अनमोल काम कर रहा है इसलिए एनोटेशन का उपयोग करके बिन्डी कॉन्फ़िगरेशन ठीक है।

from("file://data/inbox?noop=true&maxMessagesPerPoll=1&delay=5000") 
    .unmarshal() 
    .bindy(BindyType.Csv, "com.ess.myapp.core")   
    .to("jms:rawTraffic"); 

पर्यावरण है: ग्रहण इंडिगो, Maven 3.0.3, कैमल 2.8.0

आप

उत्तर

26

धन्यवाद आप तो स्प्लिटर EIP का उपयोग करते हैं आप कर सकते हैं

यहाँ मार्ग है स्ट्रीमिंग मोड का उपयोग करें जिसका अर्थ है कि ऊंट पंक्ति के आधार पर फ़ाइल को पंक्ति पर संसाधित करेगा।

from("file://data/inbox?noop=true&maxMessagesPerPoll=1&delay=5000") 
    .split(body().tokenize("\n")).streaming() 
    .unmarshal().bindy(BindyType.Csv, "com.ess.myapp.core")   
    .to("jms:rawTraffic"); 
+0

के लिए धन्यवाद क्लॉस अपने जवाब। अब मुझे एक अलग समस्या का सामना करना पड़ रहा है। मेरे छोटे अभ्यास के बाद मैं कतार से निकालने की कोशिश कर रहा हूं और '.convertBodyTo (String.class) के साथ एक फ़ाइल में लिख रहा हूं। ("फ़ाइल: डेटा/आउटबॉक्स? FileExist = Append")' लेकिन केवल पहली पंक्ति हो जाती है लिखा हुआ। वही, अगर मैं फ़ाइल विकल्प ओवरराइड का उपयोग करता हूं तो मुझे केवल अंतिम पंक्ति मिलती है। फ़ाइल में लिखी गई सीएसवी फ़ाइल से सभी पंक्तियों का कोई तरीका है? धन्यवाद – Taka

+0

आपको फ़ाइल नाम निर्दिष्ट करने की आवश्यकता है,। ("फ़ाइल: डेटा/आउटबॉक्स? FileName = data.csv और fileExist = संलग्न करें") –

+0

'.streaming() 'के बाद' .thread()' जोड़ें 'यह अधिक कुशल हो सकता है ? – Pith

2

रिकॉर्ड के लिए और अन्य उपयोगकर्ताओं जो इस के लिए के रूप में ज्यादा के रूप में मुझे खोजा गया हो सकता है के लिए, इस बीच वहाँ एक आसान तरीका है जो भी useMaps के साथ अच्छी तरह से काम करता है लगता है:

CsvDataFormat csv = new CsvDataFormat() 
    .setLazyLoad(true) 
    .setUseMaps(true); 

from("file://data/inbox?noop=true&maxMessagesPerPoll=1&delay=5000") 
    .unmarshal(csv) 
    .split(body()).streaming() 
    .to("log:mappedRow?multiline=true"); 
संबंधित मुद्दे