ইনক্রিমেন্টাল প্রসেসিং: দ্রুত পাইপলাইন আপডেট

এই নিবন্ধটি ব্যাখ্যা করে কীভাবে এসইও পাইপলাইন ইনক্রিমেন্টাল প্রসেসিং ব্যবহার করে ঘন্টার বদলে সেকেন্ডে চলে।

সমস্যা: সম্পূর্ণ রিপ্রসেসিং ধীর

স্ক্র্যাচ থেকে সম্পূর্ণ পাইপলাইন চালাতে ঘন্টা লেগে যায়:

  • ধাপ ০ (সোর্স এম্বেডিং): ১৫ মিনিট (৬৫,০০০ পণ্য)

  • ধাপ ১ (কোয়েরি ফেচিং): ১০ মিনিট (এপিআই কল)

  • ধাপ ২ (কোয়েরি ক্লাস্টারিং): ৩০ মিনিট (৬৫K×৬৫K সাদৃশ্য)

  • ধাপ ৩ (ফ্রেজ ম্যাপিং): ২০ মিনিট (এম্বেডিং + ম্যাচিং)

  • ধাপ ৪ (পণ্য ম্যাচিং): ৪৫ মিনিট (কোয়েরি × পণ্য)

  • ধাপ ৫ (সম্পর্কিত সার্চ): ২৫ মিনিট (কোয়েরি × কোয়েরি সাদৃশ্য)

মোট: সম্পূর্ণ পাইপলাইনের জন্য ~২.৫ ঘন্টা

সমস্যা: দৈনিক আপডেটে অপরিবর্তিত ডেটা পুনরায় গণনা করতে ২.৫ ঘন্টা নষ্ট হত।

সমাধান: তিন-স্তর ইনক্রিমেন্টাল কৌশল

অপ্রয়োজনীয় কাজ এড়াতে আমরা তিনটি কৌশল ব্যবহার করি:

১. ধাপ ডিঙ্গানো (কোর্স-গ্রেইন্ড)

যদি আউটপুট ফ্রেশ থাকে এবং স্ক্রিপ্ট অপরিবর্তিত থাকে তবে সম্পূর্ণ ধাপ ডিঙ্গিয়ে যান।

২. ইনক্রিমেন্টাল এম্বেডিং (মিডিয়াম-গ্রেইন্ড)

শুধুমাত্র নতুন/পরিবর্তিত আইটেম এম্বেড করুন, ক্যাশে করা এম্বেডিং পুনরায় ব্যবহার করুন।

৩. চেকপয়েন্টিং (ফাইন-গ্রেইন্ড)

দীর্ঘ অপারেশনের সময় অগ্রগতি সংরক্ষণ করুন, ব্যর্থতার পর চেকপয়েন্ট থেকে পুনরায় শুরু করুন।

ধাপ ডিঙ্গানোর কৌশল

কিভাবে কাজ করে

প্রতিটি ধাপের আগে, পরীক্ষা করুন:

আউটপুট আছে কি? না থাকলে, ধাপটি চালান।

আউটপুটের বয়স: ৭ দিনের বেশি পুরানো হলে, ধাপটি চালান।

স্ক্রিপ্ট পরিবর্তিত হয়েছে কি? আউটপুট জেনারেট হওয়ার পর স্ক্রিপ্ট পরিবর্তিত হলে, ধাপটি চালান।

সব চেক পাস হয়েছে? ধাপটি ডিঙ্গিয়ে যান।

বাস্তবায়ন

def should_skip_step(output_path, script_path, days=7):
    # Check if output exists
    if not os.path.exists(output_path):
# ... (implementation details omitted)

ব্যবহার

প্রতিটি স্ক্রিপ্ট শুরুতে পরীক্ষা করে:

from seo_common import should_skip_step

if should_skip_step(SEO_SOURCE_EMBEDDINGS_PATH, __file__):
    print("✓ Skipping: Output is fresh and script unchanged")
    return

সুবিধা

দ্রুত দৈনিক রান: ডেটা অপরিবর্তিত থাকলে বেশিরভাগ ধাপ ডিঙ্গানো হয়

স্বয়ংক্রিয় অবৈধকরণ: স্ক্রিপ্ট পরিবর্তন পুনরায় রান ট্রিগার করে

কনফিগারযোগ্য ফ্রেশনেস: প্রতি ধাপের জন্য days প্যারামিটার সামঞ্জস্য করুন

ইনক্রিমেন্টাল এম্বেডিং কৌশল

কিভাবে কাজ করে

আইটেম (পণ্য, কোয়েরি, ফ্রেজ) এম্বেড করার সময়:

ক্যাশে লোড করুন: পূর্বে এম্বেড করা আইটেম এবং তাদের কীগুলি পড়ুন

কী তুলনা করুন: নতুন, পরিবর্তিত এবং মুছে ফেলা আইটেম চিহ্নিত করুন

শুধুমাত্র নতুন এম্বেড করুন: ক্যাশে নেই এমন আইটেম শুধুমাত্র এম্বেড করুন

মার্জ করুন: ক্যাশে করা এম্বেডিংগুলিকে সঠিক ক্রমে নতুন এম্বেডিংগুলির সাথে একত্রিত করুন

সংরক্ষণ করুন: আপডেট করা ক্যাশে লিখুন

বাস্তবায়ন

incremental_embed_with_keys ফাংশন এটি হ্যান্ডল করে:

def incremental_embed_with_keys(
    items,           # Current items to embed
    keys,            # Unique keys for items
# ... (implementation details omitted)

ক্যাশে হিট রেট

প্রথম রানের পর সাধারণ ক্যাশে হিট রেট:

সোর্স ডেটা (পণ্য, পার্টস, আর্টিকেল):

  • প্রথম রান: ০% (সমস্ত ৬৫,০০০ আইটেম এম্বেড)

  • দৈনিক রান: ৯৯.৫% (শুধুমাত্র ~৩০০ নতুন/পরিবর্তিত আইটেম)

কোয়েরি (জিএসসি, অ্যাডস, লাইভ থেকে):

  • প্রথম রান: ০% (সমস্ত ৬৫,০০০ কোয়েরি এম্বেড)

  • দৈনিক রান: ৯৯.২% (শুধুমাত্র ~৫০০ নতুন কোয়েরি)

ফ্রেজ ম্যাপিং:

  • প্রথম রান: ০% (সমস্ত ৫,০০০ ফ্রেজ এম্বেড)

  • দৈনিক রান: ৯৯.৮% (শুধুমাত্র ~১০ নতুন ফ্রেজ)

কর্মক্ষমতার প্রভাব

প্রথম রান (কোল্ড ক্যাশে):

  • সোর্স এম্বেডিং: ১৫ মিনিট (৬৫,০০০ আইটেম)

  • কোয়েরি এম্বেডিং: ১০ মিনিট (৬৫,০০০ কোয়েরি)

  • ফ্রেজ এম্বেডিং: ২ মিনিট (৫,০০০ ফ্রেজ)

দৈনিক রান (ওয়ার্ম ক্যাশে):

  • সোর্স এম্বেডিং: ১০ সেকেন্ড (৩০০ আইটেম, ৯৯.৫% হিট রেট)

  • কোয়েরি এম্বেডিং: ৫ সেকেন্ড (৫০০ কোয়েরি, ৯৯.২% হিট রেট)

  • ফ্রেজ এম্বেডিং: ১ সেকেন্ড (১০ ফ্রেজ, ৯৯.৮% হিট রেট)

গতি বৃদ্ধি: ৯০-১৮০× দ্রুত

চেকপয়েন্টিং কৌশল

কিভাবে কাজ করে

দীর্ঘ চলমান অপারেশনের জন্য (৬৫,০০০ আইটেম এম্বেড করা):

ব্যাচ প্রসেসিং: আইটেম ব্যাচে প্রসেস করুন (যেমন, ১,০০০ আইটেম)

চেকপয়েন্ট সংরক্ষণ করুন: প্রতিটি ব্যাচের পরে, জমা হওয়া ফলাফল সংরক্ষণ করুন

ব্যর্থতার পর পুনরায় শুরু করুন: প্রক্রিয়াটি ক্র্যাশ করলে, শেষ চেকপয়েন্ট থেকে পুনরায় শুরু করুন

চূড়ান্ত সংরক্ষণ: সমস্ত ব্যাচ শেষ হওয়ার পর, সম্পূর্ণ ফলাফল সংরক্ষণ করুন

বাস্তবায়ন

চেকপয়েন্টিং incremental_embed_with_keys-এ অন্তর্নির্মিত:

checkpoint_every = 1000  # Save every 1,000 items

embeddings_list = []
# ... (implementation details omitted)

সুবিধা

ক্র্যাশ রিকভারি: আবার শুরু করার পরিবর্তে শেষ চেকপয়েন্ট থেকে পুনরায় শুরু করুন

অগ্রগতি দৃশ্যমানতা: প্রতি ১,০০০ আইটেমে অগ্রগতি দেখুন

মেমরি দক্ষতা: ব্যাচে প্রসেস করুন, একবারে সব লোড করবেন না

পাইপলাইন জুড়ে ইন্টিগ্রেশন

ইনক্রিমেন্টাল প্রসেসিং একাধিক ধাপে ব্যবহৃত হয়:

ধাপ ০: সোর্স ডেটা এম্বেডিং

ইনক্রিমেন্টাল: শুধুমাত্র নতুন/পরিবর্তিত পণ্য, পার্টস, আর্টিকেল এম্বেড করুন

চেকপয়েন্টিং: প্রতি ১,০০০ আইটেমে সংরক্ষণ করুন

ডিঙ্গানোর যুক্তি: আউটপুট ৭ দিনের কম পুরানো এবং স্ক্রিপ্ট অপরিবর্তিত থাকলে ডিঙ্গিয়ে যান

দেখুন: সোর্স ডেটা এম্বেডিং

ধাপ ১: কোয়েরি ফেচিং

ইনক্রিমেন্টাল: এপিআই কল শুধুমাত্র নতুন ডেটা (শেষ রান থেকে) ফেচ করে

ডিঙ্গানোর যুক্তি: আউটপুট ১ দিনের কম পুরানো হলে ডিঙ্গিয়ে যান

দেখুন: কোয়েরি ফেচিং

ধাপ ৩খ: কোয়েরি এম্বেডিং

ইনক্রিমেন্টাল: শুধুমাত্র নতুন কোয়েরি এম্বেড করুন

চেকপয়েন্টিং: প্রতি ১,০০০ কোয়েরিতে সংরক্ষণ করুন

ডিঙ্গানোর যুক্তি: আউটপুট ৭ দিনের কম পুরানো এবং স্ক্রিপ্ট অপরিবর্তিত থাকলে ডিঙ্গিয়ে যান

দেখুন: কোয়েরি এম্বেডিং

ধাপ ৪: ফ্রেজ ম্যাপিং সম্প্রসারণ

ইনক্রিমেন্টাল: শুধুমাত্র নতুন ফ্রেজ এম্বেড করুন

চেকপয়েন্টিং: প্রতি ১,০০০ ফ্রেজে সংরক্ষণ করুন

ডিঙ্গানোর যুক্তি: আউটপুট ৭ দিনের কম পুরানো এবং স্ক্রিপ্ট অপরিবর্তিত থাকলে ডিঙ্গিয়ে যান

দেখুন: ফ্রেজ-টু-ফিল্টার ম্যাপিংস

ধাপ ৬: পণ্য ম্যাচিং

ইনক্রিমেন্টাল: শুধুমাত্র নতুন কোয়েরি ম্যাচ করুন

ডিঙ্গানোর যুক্তি: আউটপুট ৭ দিনের কম পুরানো এবং স্ক্রিপ্ট অপরিবর্তিত থাকলে ডিঙ্গিয়ে যান

দেখুন: পণ্য ম্যাচিং

কনফিগারেশন

ইনক্রিমেন্টাল প্রসেসিং প্রতি ধাপে কনফিগার করা হয়:

ফ্রেশনেস থ্রেশহোল্ড

# Skip if output < 7 days old (default)
should_skip_step(output_path, script_path, days=7)

# Skip if output < 1 day old (for frequently changing data)
should_skip_step(output_path, script_path, days=1)

চেকপয়েন্ট ফ্রিকোয়েন্সি

# Save every 1,000 items (default)
incremental_embed_with_keys(..., checkpoint_every=1000)

# Save every 5,000 items (for faster processing, less safety)
incremental_embed_with_keys(..., checkpoint_every=5000)

ব্যাচ সাইজ

# Embed 32 items per batch (default, balanced)
incremental_embed_with_keys(..., batch_size=32)

# Embed 64 items per batch (faster on GPU, more memory)
incremental_embed_with_keys(..., batch_size=64)

মনিটরিং এবং ডিবাগিং

ক্যাশে পরিসংখ্যান

প্রতিটি ধাপ ক্যাশে পরিসংখ্যান প্রিন্ট করে:

✓ Found existing cache, checking for changes...
  Existing: 65,000 items
  Current:  65,300 items
  Reusing: 64,800 embeddings
  New:     500 items to embed

ডিঙ্গানো বার্তা

যখন ধাপগুলি ডিঙ্গানো হয়:

✓ Skipping 0_embed_source_data.py: Output is fresh and script unchanged.

চেকপয়েন্ট বার্তা

দীর্ঘ অপারেশনের সময়:

Embedding 65,000 items (checkpointing every 1,000)...
  Batch 0-1000...
    ✓ Checkpoint saved (1,000 total)
  Batch 1000-2000...
    ✓ Checkpoint saved (2,000 total)
  ...

রেফারেন্স

প্রযুক্তিগত ধারণা

সম্পর্কিত নিবন্ধ

সারসংক্ষেপ

ইনক্রিমেন্টাল প্রসেসিং পাইপলাইনকে ৯০-১৮০× দ্রুত করে:

তিন-স্তর কৌশল:

  • ✅ ধাপ ডিঙ্গানো (আউটপুট ফ্রেশ থাকলে সম্পূর্ণ ধাপ ডিঙ্গিয়ে যান)

  • ✅ ইনক্রিমেন্টাল এম্বেডিং (শুধুমাত্র নতুন/পরিবর্তিত আইটেম এম্বেড করুন)

  • ✅ চেকপয়েন্টিং (অগ্রগতি সংরক্ষণ করুন, ব্যর্থতার পর পুনরায় শুরু করুন)

কর্মক্ষমতা:

  • ✅ প্রথম রান: ~২.৫ ঘন্টা (সম্পূর্ণ পাইপলাইন)

  • ✅ দৈনিক রান: ~৫ মিনিট (ইনক্রিমেন্টাল আপডেট)

  • ✅ ক্যাশে হিট রেট: প্রথম রানের পর ৯৯%+

সুবিধা:

  • ✅ দ্রুত দৈনিক আপডেট (ঘন্টার বদলে মিনিট)

  • ✅ স্বয়ংক্রিয় অবৈধকরণ (স্ক্রিপ্ট পরিবর্তন পুনরায় রান ট্রিগার করে)

  • ✅ ক্র্যাশ রিকভারি (চেকপয়েন্ট থেকে পুনরায় শুরু করুন)

  • ✅ মেমরি দক্ষ (ব্যাচ প্রসেসিং)

এই কৌশলটি অপরিবর্তিত ডেটার উপর কম্পিউট নষ্ট না করেই দৈনিক পাইপলাইন রান সক্ষম করে।


← ডকুমেন্টেশন ইনডেক্সে ফিরে যান