স্টোরেজ কৌশল: ভালকি বনাম JSON বনাম NumPy
এই নিবন্ধটি ব্যাখ্যা করে কেন আমরা এসইও পাইপলাইন এবং সার্চ সার্ভিসে বিভিন্ন ধরনের ডেটার জন্য বিভিন্ন স্টোরেজ প্রযুক্তি ব্যবহার করি।
সমস্যা: একটি সমাধান সব ক্ষেত্রে প্রযোজ্য নয়
বিভিন্ন ডেটার বিভিন্ন অ্যাক্সেস প্যাটার্ন রয়েছে:
-
এমবেডিংস (5K x 384 ফ্লোট): দ্রুত ভেক্টর অপারেশনের প্রয়োজন (কোসাইন সাদৃশ্য)
-
ফ্রেজ ম্যাপিংস (2500+ ফ্রেজ): মানুষের সম্পাদনা, ভার্সন কন্ট্রোলের প্রয়োজন
-
কোয়েরি ক্যাশে (লাইভ কোয়েরি): দ্রুত কী-ভ্যালু লুকআপ, টিটিএল এক্সপায়ারেশনের প্রয়োজন
-
প্রোডাক্ট ডেটা (64K প্রোডাক্ট): স্ট্রাকচার্ড অ্যাক্সেস, কম্প্যাটিবিলিটি নিয়মের প্রয়োজন
সবার জন্য একই স্টোরেজ ব্যবহার করা অদক্ষ হবে।
তিনটি স্টোরেজ প্রযুক্তি
১. NumPy অ্যারেগুলো: ভেক্টর অপারেশন
ব্যবহারের ক্ষেত্র: এমবেডিংস (প্রোডাক্ট, কোয়েরি, ফ্রেজ)
কেন NumPy:
-
দ্রুত ভেক্টর গণনা: ম্যাট্রিক্স অপারেশনের জন্য অপটিমাইজড C/Fortran লাইব্রেরি
-
মেমরি-ম্যাপড ফাইল: RAM-এ কপি না করে বড় অ্যারে লোড করা
-
ব্যাচ অপারেশন: মিলিসেকেন্ডে হাজার হাজার ভেক্টর প্রক্রিয়াকরণ
-
স্ট্যান্ডার্ড ফরম্যাট: ML লাইব্রেরির সাথে সামঞ্জস্যপূর্ণ (scikit-learn, TensorFlow)
ফাইল ফরম্যাট: বাইনারি .npy ফাইল
লোডিং:
import numpy as np
# মেমরি-ম্যাপড (পুরো ফাইল RAM-এ লোড করে না)
embeddings = np.load('embeddings.npy', mmap_mode='r')
# কোসাইন সাদৃশ্য গণনা
from sklearn.metrics.pairwise import cosine_similarity
similarities = cosine_similarity(query_embedding, embeddings)
পারফরম্যান্স: রিয়েল-টাইম ইনফারেন্সের জন্য উপযুক্ত গতিতে ব্যাপক সাদৃশ্য অনুসন্ধান।
২. JSON ফাইল: মানুষের দ্বারা সম্পাদনযোগ্য ডেটা
ব্যবহারের ক্ষেত্র: কনফিগারেশন, ম্যাপিং, মেটাডেটা
কেন JSON:
-
মানুষের পাঠযোগ্য: পরিদর্শন ও ডিবাগ করা সহজ
-
ভার্সন কন্ট্রোল: Git diff ঠিক কী পরিবর্তিত হয়েছে তা দেখায়
-
ম্যানুয়াল সম্পাদনা: কোড ছাড়াই ত্রুটি ঠিক করা যায়
-
সর্বজনীন ফরম্যাট: প্রতিটি ভাষা JSON পার্স করতে পারে
আমরা কী সংরক্ষণ করি:
-
ফ্রেজ-টু-ফিল্টার ম্যাপিং: ফ্রেজ → ফিল্টার নিয়ম
-
প্রোডাক্ট বৈশিষ্ট্য: প্রোডাক্ট → ফিচার ডিকশনারি
-
কোয়েরি মেটাডেটা: কোয়েরি → ক্লিক, ইম্প্রেশন, উৎস
-
পাইপলাইন কনফিগারেশন: ধাপের প্যারামিটার, থ্রেশহোল্ড
ফাইল ফরম্যাট: টেক্সট .json ফাইল
লোডিং:
import json
with open('phrase_mappings.json') as f:
mappings = json.load(f)
# ডেটা অ্যাক্সেস
filters = mappings['mini pc'] # ['form_factor:mini', 'category:pc']
৩. ভালকি (রেডিস): দ্রুত কী-ভ্যালু ক্যাশে
ব্যবহারের ক্ষেত্র: লাইভ সার্চ, অটোকমপ্লিট, জনপ্রিয় কোয়েরি
কেন ভালকি:
-
ইন-মেমরি: লুকআপের জন্য মাইক্রোসেকেন্ড লেটেন্সি
-
রেডিসার্চ: ইনডেক্স সহ ভেক্টর সাদৃশ্য অনুসন্ধান
-
টিটিএল এক্সপায়ারেশন: স্বয়ংক্রিয় ক্যাশে অকার্যকরকরণ
-
পাব/সাব: সার্ভার জুড়ে রিয়েল-টাইম আপডেট
-
স্থায়িত্ব: স্থায়িত্বের জন্য ঐচ্ছিক ডিস্ক স্ন্যাপশট
আমরা কী সংরক্ষণ করি:
-
কোয়েরি এমবেডিংস ক্যাশে: সাম্প্রতিক কোয়েরি → এমবেডিংস
-
জনপ্রিয় কোয়েরি: ট্রাফিক অনুযায়ী শীর্ষ 1000 কোয়েরি
-
অটোকমপ্লিট ইনডেক্স: প্রিফিক্স → কোয়েরি পরামর্শ
-
ফিল্টার এক্সট্রাকশন ক্যাশে: কোয়েরি → নিষ্কাশিত ফিল্টার
-
সম্পর্কিত অনুসন্ধান ক্যাশে: কোয়েরি → সম্পর্কিত কোয়েরি
ডেটা স্ট্রাকচার:
-
স্ট্রিং: সাধারণ কী-ভ্যালু (কোয়েরি → এমবেডিং)
-
সর্টেড সেট: র্যাঙ্ক করা ডেটা (স্কোর অনুযায়ী জনপ্রিয় কোয়েরি)
-
রেডিসার্চ ইনডেক্স: ভেক্টর সাদৃশ্য অনুসন্ধান
-
হ্যাশ: স্ট্রাকচার্ড ডেটা (কোয়েরি মেটাডেটা)
লোডিং:
from app.shared.valkey_cache import get_valkey
valkey = get_valkey()
# ... (বাস্তবায়নের বিবরণ বাদ দেওয়া হয়েছে)
সিদ্ধান্ত ম্যাট্রিক্স
কখন NumPy ব্যবহার করবেন
মাপকাঠি:
-
ডেটা সংখ্যাসূচক (ফ্লোট, ইন্ট)
-
দ্রুত ভেক্টর অপারেশনের প্রয়োজন (ডট প্রোডাক্ট, কোসাইন সাদৃশ্য)
-
ডেটা পড়া-ভারী (বিরল আপডেট)
-
ডেটা বড় (লক্ষ লক্ষ সংখ্যা)
-
ব্যাচ প্রসেসিং (একবারে অনেক আইটেম প্রক্রিয়াকরণ)
উদাহরণ:
-
এমবেডিংস (প্রোডাক্ট, কোয়েরি, ফ্রেজ)
-
ফিচার ভেক্টর
-
সাদৃশ্য ম্যাট্রিক্স
কখন JSON ব্যবহার করবেন
মাপকাঠি:
-
ডেটা স্ট্রাকচার্ড (অবজেক্ট, অ্যারে)
-
মানুষের পাঠযোগ্যতার প্রয়োজন
-
ভার্সন কন্ট্রোলের প্রয়োজন (Git)
-
ডেটা মাঝে মাঝে পরিবর্তিত হয় (ম্যানুয়াল সম্পাদনা)
-
ডেটা ছোট-মাঝারি (<100 MB)
উদাহরণ:
-
কনফিগারেশন ফাইল
-
ফ্রেজ ম্যাপিং
-
প্রোডাক্ট মেটাডেটা
-
পাইপলাইন প্যারামিটার
কখন ভালকি ব্যবহার করবেন
মাপকাঠি:
-
দ্রুত লুকআপের প্রয়োজন (মাইক্রোসেকেন্ড)
-
ডেটা ঘন ঘন পরিবর্তিত হয় (লাইভ কোয়েরি)
-
টিটিএল এক্সপায়ারেশনের প্রয়োজন (ক্যাশে অকার্যকরকরণ)
-
পাব/সাবের প্রয়োজন (রিয়েল-টাইম আপডেট)
-
ভেক্টর সার্চের প্রয়োজন (রেডিসার্চ)
উদাহরণ:
-
কোয়েরি ক্যাশে
-
অটোকমপ্লিট
-
জনপ্রিয় কোয়েরি
-
সেশন ডেটা
-
রেট লিমিটিং
হাইব্রিড পদ্ধতি
আমরা সর্বোত্তম পারফরম্যান্সের জন্য তিনটিই একত্রিত করি:
পাইপলাইন (অফলাইন প্রসেসিং)
NumPy: এমবেডিং, সাদৃশ্য ম্যাট্রিক্স গণনা
JSON: ম্যাপিং, মেটাডেটা, কনফিগারেশন সংরক্ষণ
ভালকি: ব্যবহার করা হয় না (পাইপলাইন অফলাইনে চলে)
সার্চ সার্ভিস (লাইভ কোয়েরি)
NumPy: ডিস্ক থেকে এমবেডিং লোড (মেমরি-ম্যাপড)
JSON: ডিস্ক থেকে ম্যাপিং লোড (মেমরিতে ক্যাশ করা)
ভালকি: লাইভ কোয়েরি, অটোকমপ্লিট, জনপ্রিয় কোয়েরি ক্যাশে
ডেটা ফ্লো
graph LR
Pipeline[SEO Pipeline
অফলাইন]
subgraph Storage
NP[NumPy ফাইল
embeddings.npy]
JS[JSON ফাইল
mappings.json]
end
Search[সার্চ সার্ভিস
লাইভ]
VK[ভালকি
ক্যাশে]
Pipeline --> NP
Pipeline --> JS
NP --> Search
JS --> Search
Search --> VK
VK --> Searchপারফরম্যান্স তুলনা
NumPy (মেমরি-ম্যাপড):
-
লোড সময়: তাত্ক্ষণিক (ভার্চুয়াল মেমরিতে জিরো-কপি ম্যাপিং)
-
লুকআপ সময়: প্রায় শূন্য (অ্যারে ইনডেক্সে সরাসরি CPU পয়েন্টার)
-
মেমরি: ন্যূনতম (OS-পরিচালিত পেজ ক্যাশে, প্রসেস RAM-এ থাকে না)
JSON:
-
লোড সময়: উচ্চ লেটেন্সি (সিকোয়েন্সিয়াল পার্সিং এবং অবজেক্ট ইনস্ট্যান্টিয়েশন)
-
লুকআপ সময়: দক্ষ (স্ট্যান্ডার্ড হ্যাশ ম্যাপ ওভারহেড)
-
মেমরি: যথেষ্ট (পুরো সিরিয়ালাইজড স্ট্রাকচার হিপে থাকে)
ভালকি:
-
লোড সময়: স্থায়ী (ব্যাকগ্রাউন্ড সার্ভিসে অবস্থিত)
-
লুকআপ সময়: মধ্যম (নেটওয়ার্ক রাউন্ড-ট্রিপ এবং প্রোটোকল সিরিয়ালাইজেশন অন্তর্ভুক্ত)
-
মেমরি: বহিরাগত (ডাটাবেস প্রসেসের মধ্যে বিচ্ছিন্ন)
বিজয়ী: উচ্চ-থ্রুপুট ব্যাচিংয়ের জন্য NumPy, বিতরণিত একক-কী অ্যাক্সেসের জন্য ভালকি
ভেক্টর সাদৃশ্য অনুসন্ধান
NumPy (cosine_similarity):
-
ব্যাচ অপারেশন: দ্রুত (SIMD/ভেক্টরাইজড লিনিয়ার বীজগণিতের মাধ্যমে অপটিমাইজড)
-
সমান্তরালযোগ্য: উচ্চ (সমস্ত উপলব্ধ ফিজিক্যাল CPU কোর জুড়ে স্কেল করে)
-
মেমরি: রৈখিক (এমবেডিং মাত্রার সাথে সরাসরি স্কেল করে)
ভালকি (রেডিসার্চ):
-
অনুসন্ধান গতি: উচ্চতর (বিশেষায়িত HNSW/ভেক্টর ইন্ডেক্সিং ব্যবহার করে)
-
সমান্তরালযোগ্য: সীমিত (ইঞ্জিনের থ্রেডিং মডেল দ্বারা সীমাবদ্ধ)
-
মেমরি: নিবিড় (কাঁচা এমবেডিং প্লাস ইন্ডেক্সিং মেটাডেটা প্রয়োজন)
বিজয়ী: উপ-উপলব্ধি লাইভ সার্চের জন্য ভালকি, ভারী অফলাইন বিশ্লেষণাত্মক প্রসেসিংয়ের জন্য NumPy
কনফিগারেশন লুকআপ
JSON:
-
লোড সময়: পরিবর্তনশীল (কনফিগারেশন জটিলতার সমানুপাতিক)
-
লুকআপ সময়: দ্রুত (নেটিভ ডিকশনারি অ্যাক্সেস)
-
সম্পাদনা সময়: ঘর্ষণহীন (মানুষের পাঠযোগ্য টেক্সট পরিবর্তন)
ভালকি:
-
লোড সময়: তাৎক্ষণিক (সংযোগে সক্রিয়)
-
লুকআপ সময়: নেটওয়ার্ক-বাউন্ড (অনুরোধের ওভারহেডের উপর নির্ভরশীল)
-
সম্পাদনা সময়: প্রোগ্রাম্যাটিক (CLI বা ক্লায়েন্ট SET কমান্ডের প্রয়োজন)
বিজয়ী: স্ট্যাটিক কনফিগারেশনের জন্য JSON, ডায়নামিক শেয়ার্ড স্টেটের জন্য ভালকি
তথ্যসূত্র
প্রযুক্তি
-
NumPy - অ্যারে কম্পিউটিং লাইব্রেরি
-
JSON - ডেটা ইন্টারচেঞ্জ ফরম্যাট
-
ভালকি - ইন-মেমরি ডেটা স্টোর (রেডিস ফর্ক)
-
রেডিসার্চ - ভেক্টর সার্চ মডিউল
প্রযুক্তিগত ধারণা
-
মেমরি-ম্যাপড ফাইল - উইকিপিডিয়া
-
কী-ভ্যালু ডাটাবেস - উইকিপিডিয়া
-
ভেক্টর ডাটাবেস - উইকিপিডিয়া
সম্পর্কিত নিবন্ধ
-
এসইও পাইপলাইন ওভারভিউ - সম্পূর্ণ পাইপলাইন আর্কিটেকচার
-
সার্চ সার্ভিস আর্কিটেকচার - ভালকি সহ লাইভ সার্চ
-
মাল্টি-সার্ভার আর্কিটেকচার - সার্ভার প্রতি স্টোরেজ
-
ইনক্রিমেন্টাল প্রসেসিং - ক্যাশিং কৌশল
সারসংক্ষেপ
আমরা বিভিন্ন ব্যবহারের ক্ষেত্রের জন্য অপটিমাইজ করা তিনটি স্টোরেজ প্রযুক্তি ব্যবহার করি:
NumPy (এমবেডিংস):
-
দ্রুত ভেক্টর অপারেশন (কোসাইন সাদৃশ্য)
-
মেমরি-ম্যাপড
-
ব্যাচ প্রসেসিং
-
স্ট্যান্ডার্ড ML ফরম্যাট
JSON (কনফিগারেশন):
-
মানুষের পাঠযোগ্য (সহজ ডিবাগিং)
-
ভার্সন কন্ট্রোল (Git diffs)
-
ম্যানুয়াল সম্পাদনা (কোডের প্রয়োজন নেই)
-
সর্বজনীন ফরম্যাট
ভালকি (লাইভ ক্যাশে):
-
দ্রুত লুকআপ (মাইক্রোসেকেন্ড)
-
ভেক্টর সার্চ (রেডিসার্চ)
-
টিটিএল এক্সপায়ারেশন (স্বয়ংক্রিয় অকার্যকরকরণ)
-
পাব/সাব (রিয়েল-টাইম আপডেট)
হাইব্রিড পদ্ধতি: প্রতিটি কাজের জন্য সঠিক টুল ব্যবহার করুন, সর্বোত্তম পারফরম্যান্সের জন্য একত্রিত করুন।