मुझे फायरस्टार को बड़ी संख्या में दस्तावेज लिखने की आवश्यकता है।
Node.js में ऐसा करने का सबसे तेज़ तरीका क्या है?
मुझे फायरस्टार को बड़ी संख्या में दस्तावेज लिखने की आवश्यकता है।
Node.js में ऐसा करने का सबसे तेज़ तरीका क्या है?
जवाबों:
टीएल; डीआर: फायरस्टार पर बल्क डेट क्रिएशन करने का सबसे तेज़ तरीका समानांतर व्यक्तिगत लेखन संचालन है।
फायरस्टार को 1,000 दस्तावेज लिखना:
~105.4s
अनुक्रमिक व्यक्तिगत लिखने के संचालन का उपयोग करते समय~ 2.8s
उपयोग करते समय (2) बैच लिखने का संचालन~ 1.5s
समानांतर व्यक्तिगत लिखने के संचालन का उपयोग करते समयफायरस्टार पर बड़ी संख्या में लेखन कार्य करने के लिए तीन सामान्य तरीके हैं।
रैंडमाइज्ड डॉक्यूमेंट डेटा की एक सरणी का उपयोग करते हुए, हम नीचे की ओर प्रत्येक की जांच करेंगे।
यह सबसे सरल संभव उपाय है:
async function testSequentialIndividualWrites(datas) {
while (datas.length) {
await collection.add(datas.shift());
}
}
हम प्रत्येक दस्तावेज़ को बारी-बारी से लिखते हैं, जब तक कि हम हर दस्तावेज़ न लिख लें। और हम अगले एक पर शुरू करने से पहले प्रत्येक लिखने के ऑपरेशन के पूरा होने की प्रतीक्षा करते हैं।
1,000 दस्तावेजों को लिखने में इस दृष्टिकोण के साथ लगभग 105 सेकंड लगते हैं, इसलिए थ्रूपुट लगभग 10 दस्तावेज़ प्रति सेकंड लिखते हैं ।
यह सबसे जटिल समाधान है।
async function testBatchedWrites(datas) {
let batch = admin.firestore().batch();
let count = 0;
while (datas.length) {
batch.set(collection.doc(Math.random().toString(36).substring(2, 15)), datas.shift());
if (++count >= 500 || !datas.length) {
await batch.commit();
batch = admin.firestore().batch();
count = 0;
}
}
}
आप देख सकते हैं कि हम BatchedWrite
कॉल करके एक ऑब्जेक्ट बनाते हैं batch()
, इसे भरें जब तक कि इसकी अधिकतम क्षमता 500 दस्तावेज़ न हो, और फिर इसे फायरस्टार को लिखें। हम प्रत्येक दस्तावेज़ को एक उत्पन्न नाम देते हैं जो अपेक्षाकृत अद्वितीय है (इस परीक्षण के लिए पर्याप्त अच्छा है)।
इस दृष्टिकोण के साथ 1,000 दस्तावेज़ लिखने में लगभग 2.8 सेकंड लगते हैं, इसलिए थ्रूपुट लगभग 357 दस्तावेज़ प्रति सेकंड लिखता है ।
अनुक्रमिक अलग-अलग लिखता है कि तुलना में काफी तेज है। वास्तव में: कई डेवलपर्स इस दृष्टिकोण का उपयोग करते हैं क्योंकि वे मानते हैं कि यह सबसे तेज़ है, लेकिन जैसा कि पहले से ही ऊपर दिखाया गया है, यह सच नहीं है। और कोड अब तक सबसे जटिल है, बैचों पर आकार की कमी के कारण।
फायरस्टार प्रलेखन यह बहुत सारे डेटा जोड़ने के प्रदर्शन के बारे में कहता है :
बल्क डेटा प्रविष्टि के लिए, समानांतर व्यक्तिगत लेखन के साथ एक सर्वर क्लाइंट लाइब्रेरी का उपयोग करें। बैचेड लेखन क्रमबद्ध लेखन से बेहतर प्रदर्शन करता है लेकिन समानांतर लेखन से बेहतर नहीं है।
हम इसे इस कोड के साथ परीक्षण में डाल सकते हैं:
async function testParallelIndividualWrites(datas) {
await Promise.all(datas.map((data) => collection.add(data)));
}
यह कोड add
जितनी जल्दी हो सके ऑपरेशनों को किक करता है, और तब Promise.all()
तक इंतजार करने का उपयोग करता है जब तक कि वे सभी समाप्त नहीं हो जाते। इस दृष्टिकोण के साथ संचालन समानांतर में चल सकता है।
इस दृष्टिकोण के साथ 1,000 दस्तावेज़ लिखने में लगभग 1.5 सेकंड लगते हैं, इसलिए थ्रूपुट लगभग 667 दस्तावेज़ प्रति सेकंड लिखता है ।
अंतर लगभग पहले दो दृष्टिकोणों के बीच के रूप में महान नहीं है, लेकिन यह अभी भी बैच लिखों की तुलना में 1.8 गुना अधिक तेज है।
कुछ नोट:
add()
एक विशिष्ट आईडी (विशुद्ध रूप से क्लाइंट-साइड) उत्पन्न करने से ज्यादा कुछ नहीं करती है, इसके बाद एक set()
ऑपरेशन होता है। इसलिए परिणाम समान होना चाहिए। यदि वह नहीं है जो आप निरीक्षण करते हैं, तो न्यूनतम मामले के साथ एक नया प्रश्न पोस्ट करें जो आपने कोशिश की है।