ফায়ার স্টোরে প্রচুর নথি লেখার দ্রুততম কোনটি?


উত্তর:


26

টিএল; ডিআর: ফায়ারস্টোরে বাল্ক ডেট তৈরির দ্রুততম উপায় সমান্তরাল স্বতন্ত্র রাইটিং ক্রিয়াকলাপ সম্পাদন করে।

ফায়ার স্টোরে এক হাজার ডকুমেন্ট লিখতে লাগে:

  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());
  }
}

আমরা প্রতিটি দস্তাবেজ না লিখে অবধি প্রতিটি নথি লিখি। এবং আমরা পরেরটি শুরু করার আগে প্রতিটি লেখার ক্রিয়াটি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করি wait

এই পদ্ধতির সাথে 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 গুণ বেশি দ্রুত।


কয়েকটি নোট:

  • আপনি গিথুব এ এই পরীক্ষার সম্পূর্ণ কোড খুঁজে পেতে পারেন ।
  • নোড.জেএস দিয়ে পরীক্ষাটি করা হওয়ার সময়, অ্যাডমিন এসডিকে সমর্থন করে এমন সমস্ত প্ল্যাটফর্মগুলিতে আপনি সম্ভবত একই ফলাফল পেতে পারেন।
  • ক্লায়েন্ট এসডিকে ব্যবহার করে বাল্ক সন্নিবেশগুলি সম্পাদন করবেন না, কারণ ফলাফলগুলি খুব আলাদা এবং খুব কম অনুমানযোগ্য হতে পারে।
  • যথারীতি আসল পারফরম্যান্স আপনার মেশিন, আপনার ইন্টারনেট সংযোগের ব্যান্ডউইথ এবং বিলম্ব এবং অন্যান্য অনেক কারণের উপর নির্ভর করে। তাদের উপর ভিত্তি করে আপনিও পার্থক্যগুলির মধ্যে পার্থক্য দেখতে পাবেন, যদিও আমি আশা করি ক্রমটি একই থাকবে।
  • আপনার যদি নিজের পরীক্ষায় কোনও আউটিলার থাকে বা সম্পূর্ণ ভিন্ন ফলাফল পান তবে নীচে একটি মন্তব্য করুন।
  • ব্যাচ রাইটস পারমাণবিক। সুতরাং আপনার যদি ডকুমেন্টগুলির মধ্যে নির্ভরতা থাকে এবং সমস্ত নথি অবশ্যই লিখতে হবে, বা সেগুলির কোনওটিই অবশ্যই লেখা উচিত নয়, আপনার একটি ব্যাচড রাইটিং ব্যবহার করা উচিত।

1
এটি অত্যন্ত আকর্ষণীয়, কাজটি করার জন্য আপনাকে ধন্যবাদ! ওওসি, আপনি কি সমান্তরালভাবে লেখকরা লেখার পরীক্ষা করেছেন? স্পষ্টতই, সেক্ষেত্রে আপনার কোনও দলিল উভয় ব্যাচে থাকার বিষয়টি এড়াতে আরও নিশ্চিত হওয়া দরকার।
robsiemb

1
আমি সমান্তরাল ব্যাচড লেখার পরীক্ষা করতে যাচ্ছিলাম, কিন্তু কোটা ছাড়াই (এটি একটি নিখরচায় প্রকল্প, এবং আমি আপগ্রেড করতে খুব অলস ছিলাম)। আজ আর একটি দিন, তাই আমি এটি ব্যবহার করে দেখতে পারি এবং তা উল্লেখযোগ্য হলে আমার উত্তর আপডেট করে।
ফ্রাঙ্ক ভ্যান পাফেলেন

2
@robsiemb আমি ঠিক প্যারালাল ব্যাচেড রাইটিং দিয়ে পরীক্ষা করেছি। পারফরম্যান্সটি পৃথক সমান্তরাল লেখার সাথে খুব মিল, তাই আমি বলব যে তারা আমার পরীক্ষায় প্রথম দিকে বাঁধা আছে। আমি আশা করি যে পিছন দিকে প্রসেস করা প্রকৃতির কারণে ব্যাচ করা লেখাগুলি আরও দ্রুত খারাপ হতে পারে। আরও জটিল কোডের সাথে মিশ্রিত, আমি এখনও তাদের পারমাণবিকতার জন্য কেবল তাদের ব্যবহার করার পরামর্শ দিই এবং অনুমিত-কিন্তু-অস্তিত্বের পারফরম্যান্স সুবিধার জন্য নয়।
ফ্র্যাঙ্ক ভ্যান পাফেলেন

@ ফ্র্যাঙ্কওয়ানপুফেলেন সমান্তরাল লেখাগুলি আরও দ্রুত হবে যদি আমি "যুক্ত" নথির পরিবর্তে নথিগুলি "সেট" করি? আমি বলতে চাচ্ছি, db.collection ( 'শহর') ডক ( 'লা') সেট (ডেটা) পরিবর্তে db.collection ( 'শহর') (তথ্য) যোগ
alek6dj

কলিং add()বেশি একটি অনন্য আইডি (বিশুদ্ধরূপে ক্লায়েন্ট-সাইড), একটি দ্বারা অনুসরণ উৎপন্ন কিছুই না set()অপারেশন। সুতরাং ফলাফল একই হওয়া উচিত। যদি আপনি এটি লক্ষ্য করেন না তবে সর্বনিম্ন কেস সহ একটি নতুন প্রশ্ন পোস্ট করুন যা আপনি যা চেষ্টা করেছেন তা পুনরুত্পাদন করে।
ফ্র্যাঙ্ক ভ্যান পাফেলেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.