2012-04-27 13 views
6

पर संशोधित बड़ी टेक्स्ट फ़ाइलों को पार्स करना, मुझे रीयल-टाइम में एक बड़ी सीएसवी फ़ाइल को पार्स करने की आवश्यकता है, जबकि यह संशोधित) एक अलग प्रक्रिया द्वारा संशोधित किया गया है। बड़े पैमाने पर मेरा मतलब है कि इस बिंदु पर ~ 20 जीबी, और धीरे-धीरे बढ़ रहा है। एप्लिकेशन को केवल डेटा स्ट्रीम में कुछ विसंगतियों का पता लगाने और रिपोर्ट करने की आवश्यकता है, जिसके लिए इसे केवल छोटी राज्य जानकारी (O(1) स्पेस) स्टोर करने की आवश्यकता है।फ्लाई

मैं प्रत्येक दो सेकंड में फ़ाइल के गुण (आकार) को मतदान करने, पिछली स्थिति की तलाश करने के लिए केवल पढ़ने वाली धारा खोलने के बारे में सोच रहा था, और फिर मैंने जहां पहले बंद किया था वहां पार्स जारी रखा। लेकिन चूंकि यह एक पाठ (सीएसवी) फ़ाइल है, इसलिए मुझे यह सुनिश्चित करने के लिए कि मैं हमेशा एक पूरी लाइन का विश्लेषण करता हूं, मुझे किसी भी तरह जारी रखने पर नए-पंक्ति वर्णों का ट्रैक रखने की आवश्यकता है।

यदि मुझे गलत नहीं लगता है, तो इसे लागू करने में ऐसी कोई समस्या नहीं होनी चाहिए, लेकिन मैं जानना चाहता था कि कोई सामान्य तरीका/पुस्तकालय है जो इनमें से कुछ समस्याओं को हल करता है?

नोट: मुझे CSV पार्सर की आवश्यकता नहीं है। मुझे लाइब्रेरी के बारे में जानकारी चाहिए जो फ्लाई पर संशोधित की जा रही फ़ाइल से पढ़ने वाली लाइनों को सरल बनाता है।

+0

क्या सीएसवी प्रसंस्करण को रोकना संभव है? यदि हां, तो मैं आपको आरडीबीएमएस में स्थानांतरित करने का सुझाव दूंगा। – Oybek

+0

@ ओयबेक: क्या आप इसे थोड़ा सा स्पष्ट कर सकते हैं? फ़ाइल में जो प्रक्रिया संलग्न हो रही है वह लगातार चल रही है, और मुझे लगातार लाइन से डेटा लाइन का विश्लेषण करने की आवश्यकता है (कई सेकंड देरी के साथ)। – Groo

+0

मुझे लगता है कि आपके पास फ़ाइल को उत्सर्जित करने की प्रक्रिया का कोई नियंत्रण नहीं है? –

उत्तर

1

यहाँ एक छोटी सी समस्या है:

  • पढ़ना और पार्स करने सीएसवी TextReaders के साथ एक TextReader
  • पोजिशनिंग काम नहीं करता है (अच्छी तरह) की आवश्यकता है।

पहला विचार: इसे खोलें। दोनों निर्माता और विश्लेषक गैर अनन्य मोड में संचालित करते हैं यह ReadLine-जब तक-अशक्त, रोकने, ReadLine-जब तक-शून्य, आदि


यह 7-बिट ASCII होना चाहिए संभव हो जाना चाहिए , बस कुछ गिड्स और संख्या

यह फ़ाइल स्थिति (pos + = line.Length + 2) को ट्रैक करने के लिए व्यवहार्य बनाता है। सुनिश्चित करें कि आप इसे के साथ खोलें। फिर आप इसे सादा बाइनरी स्ट्रीम के रूप में फिर से खोल सकते हैं, अंतिम स्थिति की तलाश कर सकते हैं और केवल उस स्ट्रीम में StreamReader संलग्न कर सकते हैं।

+0

आप सही हैं, शायद यह खोज करने से काफी बेहतर है। – Groo

+0

बकवास, मैंने तब तक बहु-बाइट वर्णों पर विचार नहीं किया जब तक आपने इसका उल्लेख नहीं किया। एक और महान टिप, धन्यवाद! – Groo

0

आप क्यों नहीं बस बंद एक अलग प्रक्रिया स्पिन नहीं/हर बार जब आप को पार्स शुरू थ्रेड - इस तरह से, आप डेटा स्रोत से और अपने डेटा की दिशा में दूर समवर्ती के लिए कदम (ऑन-द-फ्लाई) हिस्सा डूब - तो अब तुम सिर्फ ... कैसे अपने सभी धागे से परिणाम इकट्ठा करने के लिए यह पता लगाने की है

यह प्रत्येक थ्रेड आप स्पिन, हालांकि के लिए पूरे फ़ाइल की एक फिर से पढ़ना कर मतलब होगा ...

आप दो संस्करणों पर एक diff प्रोग्राम चला सकते हैं और वहां से उठा सकते हैं, सीएसवी डेटा स्रोत कितनी अच्छी तरह से गठित किया गया है: क्या यह पहले से लिखे गए रिकॉर्ड संशोधित करता है? या यह सिर्फ नए रिकॉर्ड जोड़ता है?यदि हां, तो आप सिर्फ बंद नई सामग्री (वर्तमान-EOF को अंतिम स्थिति) एक नई फ़ाइल में विभाजित कर सकते हैं, और एक पृष्ठभूमि सूत्र में खाली समय में उन पर कार्रवाई:

  • मतदान धागा याद है पिछले फ़ाइल आकार
  • जब फ़ाइल बड़ा हो जाता है:, अंत करने के लिए अंतिम स्थिति से तलाश
  • पृष्ठभूमि धागा किसी भी अस्थायी फ़ाइलों को अभी भी छोड़ दिया प्रोसेस करता है, सृष्टि के क्रम में अस्थायी फ़ाइल में सहेज लें/संशोधन
+1

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

2

मैं इसे परीक्षण नहीं था, लेकिन मैं आपको लगता है एक अलग प्रक्रिया ने आपकी फ़ाइल को संशोधित करते समय यह पता लगाने के लिए एक FileSystemWatcher का उपयोग कर सकते हैं। बदले गए ईवेंट में, आप पहले सहेजी गई स्थिति की तलाश कर सकेंगे, और अतिरिक्त सामग्री पढ़ सकते हैं।

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