फायरस्टार को बहुत सारे दस्तावेज़ लिखने का सबसे तेज़ तरीका क्या है?


जवाबों:


26

टीएल; डीआर: फायरस्टार पर बल्क डेट क्रिएशन करने का सबसे तेज़ तरीका समानांतर व्यक्तिगत लेखन संचालन है।

फायरस्टार को 1,000 दस्तावेज लिखना:

  1. ~105.4s अनुक्रमिक व्यक्तिगत लिखने के संचालन का उपयोग करते समय
  2. ~ 2.8s उपयोग करते समय (2) बैच लिखने का संचालन
  3. ~ 1.5s समानांतर व्यक्तिगत लिखने के संचालन का उपयोग करते समय

फायरस्टार पर बड़ी संख्या में लेखन कार्य करने के लिए तीन सामान्य तरीके हैं।

  1. अनुक्रम में प्रत्येक व्यक्तिगत लेखन ऑपरेशन करें।
  2. बैच लेखन कार्यों का उपयोग करना।
  3. समानांतर में व्यक्तिगत लेखन संचालन करना।

रैंडमाइज्ड डॉक्यूमेंट डेटा की एक सरणी का उपयोग करते हुए, हम नीचे की ओर प्रत्येक की जांच करेंगे।


व्यक्तिगत अनुक्रमिक लेखन संचालन

यह सबसे सरल संभव उपाय है:

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 गुना अधिक तेज है।


कुछ नोट:

  • आप इस परीक्षण का पूरा कोड जीथब पर पा सकते हैं ।
  • हालांकि परीक्षण Node.js के साथ किया गया था, आपको सभी प्लेटफ़ॉर्म पर समान परिणाम प्राप्त होने की संभावना है जो एडमिन SDK समर्थन करता है।
  • क्लाइंट एसडीके का उपयोग करके थोक आवेषण प्रदर्शन न करें, क्योंकि परिणाम बहुत भिन्न और बहुत कम अनुमानित हो सकते हैं।
  • हमेशा की तरह वास्तविक प्रदर्शन आपकी मशीन, बैंडविड्थ और आपके इंटरनेट कनेक्शन की विलंबता और कई अन्य कारकों पर निर्भर करता है। उन लोगों के आधार पर आप मतभेदों में अंतर देख सकते हैं, हालांकि मुझे उम्मीद है कि आदेश समान रहेगा।
  • यदि आपके पास अपने स्वयं के परीक्षणों में कोई आउटलेयर है, या पूरी तरह से अलग परिणाम मिलते हैं, तो नीचे एक टिप्पणी छोड़ दें।
  • बैच लिखते हैं परमाणु हैं। इसलिए यदि आपके पास दस्तावेजों के बीच निर्भरता है और सभी दस्तावेजों को लिखा जाना चाहिए, या उनमें से कोई भी लिखित नहीं होना चाहिए, तो आपको एक बैच लिखा हुआ उपयोग करना चाहिए।

1
यह सुपर दिलचस्प है, काम करने के लिए धन्यवाद! OOC, क्या आपने परीक्षण किया है कि बैच लिख रहा है समानांतर में चल रहा है? जाहिर है, उस स्थिति में आपको किसी भी दस्तावेज़ को दोनों बैचों में होने से बचने के लिए और भी अधिक सुनिश्चित होना चाहिए।
रोज़

1
मैं समानांतर बैच लिखने का परीक्षण करने वाला था, लेकिन कोटा से बाहर चला गया (यह एक निशुल्क परियोजना है, और मैं उन्नयन के लिए बहुत आलसी था)। आज एक और दिन है, इसलिए मैं इसे एक कोशिश दे सकता हूं, और यदि यह महत्वपूर्ण है तो अपना जवाब अपडेट करें।
फ्रैंक वैन पफेलन

2
@robsiemb मैं सिर्फ समानांतर बैच के साथ परीक्षण भी लिखता है। प्रदर्शन व्यक्तिगत समानांतर लेखन के समान है, इसलिए मैं कहूंगा कि वे मेरे परीक्षणों में पहली बार बंधे हैं। मुझे उम्मीद है कि बैचेड राइट्स बैक-एंड पर संसाधित होने वाली प्रकृति के कारण तेजी से बिगड़ सकते हैं। बहुत अधिक जटिल कोड के साथ संयुक्त, मैं अभी भी केवल उनके परमाणु के लिए उपयोग करने की सलाह देता हूं और कथित-लेकिन-गैर-मौजूद प्रदर्शन प्रदर्शन लाभ नहीं।
फ्रैंक वैन पफ़ेलन

@FrankvanPuffelen समानांतर लिखने से भी तेज हो जाएगा अगर मैं "जोड़" दस्तावेजों के बजाय "सेट" दस्तावेज़ करता हूं? मेरा मतलब है, db.collection ('शहरों')। Doc ('LA')। Db.collection ('शहरों') के बजाय सेट (डेटा)। ऐड (डेटा)
alek6dj

कॉलिंग add()एक विशिष्ट आईडी (विशुद्ध रूप से क्लाइंट-साइड) उत्पन्न करने से ज्यादा कुछ नहीं करती है, इसके बाद एक set()ऑपरेशन होता है। इसलिए परिणाम समान होना चाहिए। यदि वह नहीं है जो आप निरीक्षण करते हैं, तो न्यूनतम मामले के साथ एक नया प्रश्न पोस्ट करें जो आपने कोशिश की है।
फ्रैंक वैन पफेलन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.