मैं एक उच्च प्रदर्शन सीएसवी पार्सर बनाए रख रहा हूं और थ्रूपुट को बेहतर बनाने के लिए नवीनतम तकनीक से अधिक लाभ उठाने का प्रयास करता हूं। इस विशेष कार्यों के लिए इसका मतलब है:जावा: मल्टीथ्रेडेड कैरेक्टर स्ट्रीम डिकोडिंग
- फ्लैश मेमोरी (हम एक अपेक्षाकृत सस्ती पीसीआई-एक्सप्रेस कार्ड के मालिक हैं, 1 TB की मेमोरी है कि पहुंचता है 1 जीबी/एस पढ़ा निरंतर प्रदर्शन)
- एकाधिक कोर (हम एक सस्ते के मालिक हैं 16 हार्डवेयर धागे के साथ नेहलेम सर्वर)
सीएसवी पार्सर का पहला कार्यान्वयन एकल थ्रेड किया गया था। फाइल रीडिंग, कैरेक्टर डिकोडिंग, फ़ील्ड स्प्लिटिंग, टेक्स्ट पार्सिंग, सब एक ही धागे के भीतर। परिणाम लगभग 50 एमबी/एस का एक थ्रूपुट था। खराब नहीं है लेकिन भंडारण सीमा से नीचे ...
दूसरा कार्यान्वयन फ़ाइल को पढ़ने के लिए एक थ्रेड का उपयोग करता है (बाइट स्तर पर), एक धागा वर्णों को डीकोड करने के लिए (बाइटबफर से चारबफर तक), और कई धागे को पार्स करने के लिए खेतों (मेरा मतलब है कि सीमित पाठ फ़ील्ड को युगल, पूर्णांक, तिथियों में पार्स करना ...)। यह हमारे बॉक्स पर 400 एमबी/एस के करीब, तेजी से काम करता है।
लेकिन अभी भी हमारे संग्रहण के प्रदर्शन से काफी नीचे है। और भविष्य में उन एसएसडी में फिर से सुधार होगा, हम जावा में इसे अधिक से अधिक नहीं ले रहे हैं। यह स्पष्ट है कि वर्तमान सीमा वर्ण डिकोडिंग (CharsetDecoder.read (...)) है। यह एक बाधा है, एक शक्तिशाली नेहलेम प्रोसेसर पर यह बाइट्स को 400 एमबी/एस पर वर्णों में बदल देता है, बहुत अच्छा है, लेकिन इसे सिंगल थ्रेडेड होना चाहिए। CharsetDecoder कुछ हद तक राज्यव्यापी है, प्रयुक्त वर्णमाला के आधार पर, और multithreaded डिकोडिंग का समर्थन नहीं करता है।
तो समुदाय के लिए मेरा प्रश्न है (और अब तक पोस्ट पढ़ने के लिए धन्यवाद): क्या कोई जावा में वर्णसेट डिकोडिंग ऑपरेशन को समानांतर करने के बारे में जानता है?
दुर्भाग्यवश, यूटीएफ -16 एक परिवर्तनीय लंबाई एन्कोडिंग है। इस तरह के साधारण यूनिकोड पार्सिंग के लिए आपको यूटीएफ -32 की आवश्यकता है। – grddev
@grddev - मैंने इसे अपनी पोस्ट में शामिल किया - यूटीएफ -16 डेटा धाराओं के मध्य में चरित्र अनुक्रमों की पहचान करना संभव है - उच्च सरोगेट जोड़े 0xD800-0xDBFF हैं और कम सरोगेट 0xDC00-0xDFFF हैं। बाइट्स की जोड़ी में कुछ और निहित है। – McDowell
मेरी टिप्पणी यूटीएफ -16 बीई के उल्लेख को संदर्भित करती है। आप पूरी तरह से डीकोडिंग काट नहीं सकते हैं। लेकिन यह वास्तव में काफी सरल है। – grddev