मैं node.js. में एक फ़ाइल (300,000 लाइनें) पढ़ रहा हूँ मैं उन्हें स्टोर करने के लिए 5,000 लाइनों के बैचों में अन्य एप्लिकेशन (लोचदार खोज) में लाइन भेजना चाहता हूं। इसलिए जब भी मैं 5,000 लाइनों को पढ़ना समाप्त करता हूं, तो मैं उन्हें एडीआई के माध्यम से उन्हें स्टोर करने के लिए एलआईसी के माध्यम से थोक में भेजना चाहता हूं और फिर बाकी फाइल को पढ़ना जारी रखता हूं और हर 5,000 लाइन को थोक में भेजता हूं।गैर-अवरुद्ध व्यवहार में नहीं, नोड.जेएस या जावास्क्रिप्ट के साथ फ़ाइल की रेखाओं को कैसे पढ़ा जाए?
मैं इस कार्य के लिए जावा (या ऐसे सी, सी ++, अजगर, आदि के रूप में किसी अन्य अवरुद्ध भाषा) का उपयोग करना चाहते हैं, तो मैं कुछ इस तरह करेंगे:
int countLines = 0;
String bulkString = "";
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("filePath.txt")));
while ((currentLine = br.readLine()) != null) {
countLines++;
bulkString += currentLine;
if(countLines >= 5000){
//send bulkString to Elasticsearch via APIs
countLines = 0;
bulkString = "";
}
}
अगर मैं चाहता हूँ Node.js साथ एक ही बात करते हैं, मुझे क्या करना होगा:
var countLines = 0;
var bulkString = "";
var instream = fs.createReadStream('filePath.txt');
var rl = readline.createInterface(instream, outstream);
rl.on('line', function(line) {
if(countLines >= 5000){
//send bulkString to via APIs
client.bulk({
index: 'indexName',
type: 'type',
body: [bulkString]
}, function (error, response) {
//task is done
});
countLines = 0;
bulkString = "";
}
}
समस्या Node.js साथ यह इतना गैर अवरुद्ध यह अगले भेजने से पहले पहले एपीआई प्रतिक्रिया के लिए प्रतीक्षा नहीं करता है लाइनों का बैच। मुझे पता है कि यह done.js के लिए लाभ के रूप में गिना जा सकता है क्योंकि यह I/O की प्रतीक्षा नहीं करता है, लेकिन समस्या यह है कि यह Elasticsearch को बहुत अधिक डेटा भेजता है। इसके लिए लोचदार खोज की कतार पूरी हो जाएगी और यह अपवाद फेंक देगा।
मेरा प्रश्न से पहले ही अगली पंक्तियों को पढ़ने के लिए जारी है या यह Elasticsearch को लाइनों के अगले बैच भेजता पहले कि मैं कैसे कर सकते हैं एपीआई से प्रतिक्रिया के लिए प्रतीक्षा करने Node.js है।
मुझे पता है कि मैं कतार आकार बढ़ाने के लिए Elasticsearch में कुछ पैरामीटर सेट कर सकता हूं, लेकिन मुझे इस मुद्दे के लिए node.js के व्यवहार को अवरुद्ध करने में रूचि है। मैं कॉलबैक की अवधारणा से परिचित हूं, लेकिन मैं इस परिदृश्य में कॉलबैक का उपयोग करने के तरीके के बारे में नहीं सोच सकता, ताकि नोड-डीजे को गैर-अवरुद्ध मोड में Elasticsearch API को कॉल करने से रोका जा सके।
धन्यवाद, मेरे लिए काम किया। – Soheil