ইনক্রিমেন্টাল প্রসেসিং: দ্রুত পাইপলাইন আপডেট
এই নিবন্ধটি ব্যাখ্যা করে কীভাবে এসইও পাইপলাইন ইনক্রিমেন্টাল প্রসেসিং ব্যবহার করে ঘন্টার বদলে সেকেন্ডে চলে।
সমস্যা: সম্পূর্ণ রিপ্রসেসিং ধীর
স্ক্র্যাচ থেকে সম্পূর্ণ পাইপলাইন চালাতে ঘন্টা লেগে যায়:
-
ধাপ ০ (সোর্স এম্বেডিং): ১৫ মিনিট (৬৫,০০০ পণ্য)
-
ধাপ ১ (কোয়েরি ফেচিং): ১০ মিনিট (এপিআই কল)
-
ধাপ ২ (কোয়েরি ক্লাস্টারিং): ৩০ মিনিট (৬৫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)
...
রেফারেন্স
প্রযুক্তিগত ধারণা
-
ইনক্রিমেন্টাল লার্নিং - উইকিপিডিয়া
-
চেকপয়েন্টিং - উইকিপিডিয়া
-
ক্যাশিং - উইকিপিডিয়া
সম্পর্কিত নিবন্ধ
-
এসইও পাইপলাইন ওভারভিউ - সম্পূর্ণ পাইপলাইন আর্কিটেকচার
-
সোর্স ডেটা এম্বেডিং - ইনক্রিমেন্টাল পণ্য এম্বেডিং
-
কোয়েরি এম্বেডিং - ইনক্রিমেন্টাল কোয়েরি এম্বেডিং
-
ফ্রেজ-টু-ফিল্টার ম্যাপিংস - ইনক্রিমেন্টাল ফ্রেজ এম্বেডিং
সারসংক্ষেপ
ইনক্রিমেন্টাল প্রসেসিং পাইপলাইনকে ৯০-১৮০× দ্রুত করে:
তিন-স্তর কৌশল:
-
✅ ধাপ ডিঙ্গানো (আউটপুট ফ্রেশ থাকলে সম্পূর্ণ ধাপ ডিঙ্গিয়ে যান)
-
✅ ইনক্রিমেন্টাল এম্বেডিং (শুধুমাত্র নতুন/পরিবর্তিত আইটেম এম্বেড করুন)
-
✅ চেকপয়েন্টিং (অগ্রগতি সংরক্ষণ করুন, ব্যর্থতার পর পুনরায় শুরু করুন)
কর্মক্ষমতা:
-
✅ প্রথম রান: ~২.৫ ঘন্টা (সম্পূর্ণ পাইপলাইন)
-
✅ দৈনিক রান: ~৫ মিনিট (ইনক্রিমেন্টাল আপডেট)
-
✅ ক্যাশে হিট রেট: প্রথম রানের পর ৯৯%+
সুবিধা:
-
✅ দ্রুত দৈনিক আপডেট (ঘন্টার বদলে মিনিট)
-
✅ স্বয়ংক্রিয় অবৈধকরণ (স্ক্রিপ্ট পরিবর্তন পুনরায় রান ট্রিগার করে)
-
✅ ক্র্যাশ রিকভারি (চেকপয়েন্ট থেকে পুনরায় শুরু করুন)
-
✅ মেমরি দক্ষ (ব্যাচ প্রসেসিং)
এই কৌশলটি অপরিবর্তিত ডেটার উপর কম্পিউট নষ্ট না করেই দৈনিক পাইপলাইন রান সক্ষম করে।