ಸ್ಟೋರೇಜ್ ತಂತ್ರ: ವಾಲ್ಕಿ vs JSON vs ನಂಪೈ
ಈ ಲೇಖನವು SEO ಪೈಪ್ಲೈನ್ ಮತ್ತು ಸರ್ಚ್ ಸರ್ವಿಸ್ ನಲ್ಲಿ ವಿವಿಧ ರೀತಿಯ ಡೇಟಾಗಳಿಗಾಗಿ ನಾವು ವಿಭಿನ್ನ ಸ್ಟೋರೇಜ್ ತಂತ್ರಜ್ಞಾನಗಳನ್ನು ಏಕೆ ಬಳಸುತ್ತೇವೆ ಎಂಬುದನ್ನು ವಿವರಿಸುತ್ತದೆ.
ಸಮಸ್ಯೆ: ಒಂದೇ ಗಾತ್ರ ಎಲ್ಲರಿಗೂ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ
ವಿವಿಧ ಡೇಟಾಗಳು ವಿವಿಧ ಪ್ರವೇಶ ಮಾದರಿಗಳನ್ನು ಹೊಂದಿವೆ:
-
ಎಂಬೆಡ್ಡಿಂಗ್ಗಳು (5K x 384 ಫ್ಲೋಟ್ಗಳು): ವೇಗದ ವೆಕ್ಟರ್ ಕಾರ್ಯಾಚರಣೆಗಳು ಅಗತ್ಯ (ಕೊಸೈನ್ ಹೋಲಿಕೆ)
-
ಫ್ರೇಸ್ ಮ್ಯಾಪಿಂಗ್ಗಳು (2500+ ಫ್ರೇಸ್ಗಳು): ಮಾನವ ಸಂಪಾದನೆ, ವರ್ಷನ್ ಕಂಟ್ರೋಲ್ ಅಗತ್ಯ
-
ಪ್ರಶ್ನೆ ಕ್ಯಾಶೆ (ಲೈವ್ ಪ್ರಶ್ನೆಗಳು): ವೇಗದ ಕೀ-ವ್ಯಾಲ್ಯೂ ಲುಕ್ಅಪ್ಗಳು, TTL ಮುಕ್ತಾಯ ಅಗತ್ಯ
-
ಉತ್ಪನ್ನ ಡೇಟಾ (64K ಉತ್ಪನ್ನಗಳು): ರಚನಾತ್ಮಕ ಪ್ರವೇಶ, ಹೊಂದಾಣಿಕೆ ನಿಯಮಗಳು ಅಗತ್ಯ
ಎಲ್ಲದಕ್ಕೂ ಒಂದೇ ಸ್ಟೋರೇಜ್ ಬಳಸುವುದು ಅಪ್ರಭಾವಕಾರಿಯಾಗಿರುತ್ತದೆ.
ಮೂರು ಸ್ಟೋರೇಜ್ ತಂತ್ರಜ್ಞಾನಗಳು
1. ನಂಪೈ ಅರೇಗಳು: ವೆಕ್ಟರ್ ಕಾರ್ಯಾಚರಣೆಗಳು
ಬಳಕೆಯ ಸಂದರ್ಭ: ಎಂಬೆಡ್ಡಿಂಗ್ಗಳು (ಉತ್ಪನ್ನಗಳು, ಪ್ರಶ್ನೆಗಳು, ಫ್ರೇಸ್ಗಳು)
ನಂಪೈ ಏಕೆ:
-
ವೇಗದ ವೆಕ್ಟರ್ ಗಣಿತ: ಮ್ಯಾಟ್ರಿಕ್ಸ್ ಕಾರ್ಯಾಚರಣೆಗಳಿಗಾಗಿ ಆಪ್ಟಿಮೈಜ್ ಮಾಡಲಾದ C/ಫೋರ್ಟ್ರಾನ್ ಲೈಬ್ರರಿಗಳು
-
ಮೆಮೊರಿ-ಮ್ಯಾಪ್ಡ್ ಫೈಲ್ಗಳು: 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)
ಪ್ರದರ್ಶನ: ರಿಯಲ್-ಟೈಮ್ ಇನ್ಫರೆನ್ಸ್ಗೆ ಸೂಕ್ತವಾದ ವೇಗದಲ್ಲಿ ಬೃಹತ್ ಹೋಲಿಕೆ ಹುಡುಕಾಟಗಳು.
2. JSON ಫೈಲ್ಗಳು: ಮಾನವ-ಸಂಪಾದನೀಯ ಡೇಟಾ
ಬಳಕೆಯ ಸಂದರ್ಭ: ಕಾನ್ಫಿಗರೇಶನ್, ಮ್ಯಾಪಿಂಗ್ಗಳು, ಮೆಟಾಡೇಟಾ
JSON ಏಕೆ:
-
ಮಾನವ-ಓದಬಹುದಾದ: ಪರಿಶೀಲಿಸಲು ಮತ್ತು ಡೀಬಗ್ ಮಾಡಲು ಸುಲಭ
-
ವರ್ಷನ್ ಕಂಟ್ರೋಲ್: Git ಡಿಫ್ಗಳು ನಿಖರವಾಗಿ ಏನು ಬದಲಾಯಿತು ಎಂದು ತೋರಿಸುತ್ತದೆ
-
ಮ್ಯಾನುಯಲ್ ಸಂಪಾದನೆ: ಕೋಡ್ ಇಲ್ಲದೆ ದೋಷಗಳನ್ನು ಸರಿಪಡಿಸಬಹುದು
-
ಯೂನಿವರ್ಸಲ್ ಫಾರ್ಮ್ಯಾಟ್: ಪ್ರತಿ ಭಾಷೆಯೂ JSON ಅನ್ನು ಪಾರ್ಸ್ ಮಾಡಬಹುದು
ನಾವು ಏನನ್ನು ಸಂಗ್ರಹಿಸುತ್ತೇವೆ:
-
ಫ್ರೇಸ್-ಟು-ಫಿಲ್ಟರ್ ಮ್ಯಾಪಿಂಗ್ಗಳು: ಫ್ರೇಸ್ಗಳು → ಫಿಲ್ಟರ್ ನಿಯಮಗಳು
-
ಉತ್ಪನ್ನ ಲಕ್ಷಣಗಳು: ಉತ್ಪನ್ನಗಳು → ಲಕ್ಷಣ ನಿಘಂಟುಗಳು
-
ಪ್ರಶ್ನೆ ಮೆಟಾಡೇಟಾ: ಪ್ರಶ್ನೆಗಳು → ಕ್ಲಿಕ್ಗಳು, ಇಂಪ್ರೆಶನ್ಗಳು, ಮೂಲಗಳು
-
ಪೈಪ್ಲೈನ್ ಕಾನ್ಫಿಗರೇಶನ್: ಹಂತದ ನಿಯತಾಂಕಗಳು, ಮಿತಿಗಳು
ಫೈಲ್ ಫಾರ್ಮ್ಯಾಟ್: ಟೆಕ್ಸ್ಟ್ .json ಫೈಲ್ಗಳು
ಲೋಡ್ ಮಾಡುವುದು:
import json
with open('phrase_mappings.json') as f:
mappings = json.load(f)
# ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಿ
filters = mappings['mini pc'] # ['form_factor:mini', 'category:pc']
3. ವಾಲ್ಕಿ (ರೆಡಿಸ್): ವೇಗದ ಕೀ-ವ್ಯಾಲ್ಯೂ ಕ್ಯಾಶೆ
ಬಳಕೆಯ ಸಂದರ್ಭ: ಲೈವ್ ಹುಡುಕಾಟ, ಆಟೋಕಂಪ್ಲೀಟ್, ಜನಪ್ರಿಯ ಪ್ರಶ್ನೆಗಳು
ವಾಲ್ಕಿ ಏಕೆ:
-
ಇನ್-ಮೆಮೊರಿ: ಲುಕ್ಅಪ್ಗಳಿಗೆ ಮೈಕ್ರೋಸೆಕೆಂಡ್ ವಿಳಂಬ
-
ರೆಡಿಸರ್ಚ್: ಇಂಡೆಕ್ಸ್ಗಳೊಂದಿಗೆ ವೆಕ್ಟರ್ ಹೋಲಿಕೆ ಹುಡುಕಾಟ
-
TTL ಮುಕ್ತಾಯ: ಸ್ವಯಂಚಾಲಿತ ಕ್ಯಾಶೆ ಅಮಾನ್ಯಗೊಳಿಸುವಿಕೆ
-
ಪಬ್/ಸಬ್: ಸರ್ವರ್ಗಳಾದ್ಯಂತ ರಿಯಲ್-ಟೈಮ್ ನವೀಕರಣಗಳು
-
ನಿರಂತರತೆ: ಸ್ಥಿರತೆಗಾಗಿ ಐಚ್ಛಿಕ ಡಿಸ್ಕ್ ಸ್ನ್ಯಾಪ್ಶಾಟ್ಗಳು
ನಾವು ಏನನ್ನು ಸಂಗ್ರಹಿಸುತ್ತೇವೆ:
-
ಪ್ರಶ್ನೆ ಎಂಬೆಡ್ಡಿಂಗ್ಗಳ ಕ್ಯಾಶೆ: ಇತ್ತೀಚಿನ ಪ್ರಶ್ನೆಗಳು → ಎಂಬೆಡ್ಡಿಂಗ್ಗಳು
-
ಜನಪ್ರಿಯ ಪ್ರಶ್ನೆಗಳು: ಟ್ರಾಫಿಕ್ ಪ್ರಕಾರ ಟಾಪ್ 1000 ಪ್ರಶ್ನೆಗಳು
-
ಆಟೋಕಂಪ್ಲೀಟ್ ಇಂಡೆಕ್ಸ್: ಪೂರ್ವಪ್ರತ್ಯಯ → ಪ್ರಶ್ನೆ ಸಲಹೆಗಳು
-
ಫಿಲ್ಟರ್ ಎಕ್ಸ್ಟ್ರಾಕ್ಷನ್ ಕ್ಯಾಶೆ: ಪ್ರಶ್ನೆ → ಹೊರತೆಗೆದ ಫಿಲ್ಟರ್ಗಳು
-
ಸಂಬಂಧಿತ ಹುಡುಕಾಟಗಳ ಕ್ಯಾಶೆ: ಪ್ರಶ್ನೆ → ಸಂಬಂಧಿತ ಪ್ರಶ್ನೆಗಳು
ಡೇಟಾ ರಚನೆಗಳು:
-
ಸ್ಟ್ರಿಂಗ್ಗಳು: ಸರಳ ಕೀ-ವ್ಯಾಲ್ಯೂ (ಪ್ರಶ್ನೆ → ಎಂಬೆಡ್ಡಿಂಗ್)
-
ಸಾರ್ಟೆಡ್ ಸೆಟ್ಗಳು: ರ್ಯಾಂಕ್ ಮಾಡಲಾದ ಡೇಟಾ (ಸ್ಕೋರ್ ಪ್ರಕಾರ ಜನಪ್ರಿಯ ಪ್ರಶ್ನೆಗಳು)
-
ರೆಡಿಸರ್ಚ್ ಇಂಡೆಕ್ಸ್ಗಳು: ವೆಕ್ಟರ್ ಹೋಲಿಕೆ ಹುಡುಕಾಟ
-
ಹ್ಯಾಶ್ಗಳು: ರಚನಾತ್ಮಕ ಡೇಟಾ (ಪ್ರಶ್ನೆ ಮೆಟಾಡೇಟಾ)
ಲೋಡ್ ಮಾಡುವುದು:
from app.shared.valkey_cache import get_valkey
valkey = get_valkey()
# ... (ಅನುಷ್ಠಾನದ ವಿವರಗಳು ಬಿಟ್ಟುಬಿಡಲಾಗಿದೆ)
ನಿರ್ಧಾರ ಮ್ಯಾಟ್ರಿಕ್ಸ್
ನಂಪೈಯನ್ನು ಯಾವಾಗ ಬಳಸಬೇಕು
ಮಾನದಂಡಗಳು:
-
ಡೇಟಾ ಸಂಖ್ಯಾತ್ಮಕವಾಗಿದೆ (ಫ್ಲೋಟ್ಗಳು, ಇಂಟ್ಗಳು)
-
ವೇಗದ ವೆಕ್ಟರ್ ಕಾರ್ಯಾಚರಣೆಗಳು ಅಗತ್ಯ (ಡಾಟ್ ಉತ್ಪನ್ನ, ಕೊಸೈನ್ ಹೋಲಿಕೆ)
-
ಡೇಟಾ ರೀಡ್-ಹೆವಿ ಆಗಿದೆ (ಅಪರೂಪವಾಗಿ ನವೀಕರಿಸಲಾಗುತ್ತದೆ)
-
ಡೇಟಾ ದೊಡ್ಡದಾಗಿದೆ (ಮಿಲಿಯನ್ಗಟ್ಟಲೆ ಸಂಖ್ಯೆಗಳು)
-
ಬ್ಯಾಚ್ ಪ್ರಕ್ರಿಯೆ (ಅನೇಕ ಐಟಂಗಳನ್ನು ಒಮ್ಮೆಗೆ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಿ)
ಉದಾಹರಣೆಗಳು:
-
ಎಂಬೆಡ್ಡಿಂಗ್ಗಳು (ಉತ್ಪನ್ನಗಳು, ಪ್ರಶ್ನೆಗಳು, ಫ್ರೇಸ್ಗಳು)
-
ಲಕ್ಷಣ ವೆಕ್ಟರ್ಗಳು
-
ಹೋಲಿಕೆ ಮ್ಯಾಟ್ರಿಕ್ಸ್ಗಳು
JSON ಅನ್ನು ಯಾವಾಗ ಬಳಸಬೇಕು
ಮಾನದಂಡಗಳು:
-
ಡೇಟಾ ರಚನಾತ್ಮಕವಾಗಿದೆ (ಆಬ್ಜೆಕ್ಟ್ಗಳು, ಅರೇಗಳು)
-
ಮಾನವ ಓದಬಲ್ಲದ್ದು ಅಗತ್ಯ
-
ವರ್ಷನ್ ಕಂಟ್ರೋಲ್ (Git) ಅಗತ್ಯ
-
ಡೇಟಾ ಕೆಲವೊಮ್ಮೆ ಬದಲಾಗುತ್ತದೆ (ಮ್ಯಾನುಯಲ್ ಸಂಪಾದನೆ)
-
ಡೇಟಾ ಸಣ್ಣ-ಮಧ್ಯಮ (<100 MB)
ಉದಾಹರಣೆಗಳು:
-
ಕಾನ್ಫಿಗರೇಶನ್ ಫೈಲ್ಗಳು
-
ಫ್ರೇಸ್ ಮ್ಯಾಪಿಂಗ್ಗಳು
-
ಉತ್ಪನ್ನ ಮೆಟಾಡೇಟಾ
-
ಪೈಪ್ಲೈನ್ ನಿಯತಾಂಕಗಳು
ವಾಲ್ಕಿಯನ್ನು ಯಾವಾಗ ಬಳಸಬೇಕು
ಮಾನದಂಡಗಳು:
-
ವೇಗದ ಲುಕ್ಅಪ್ಗಳು ಅಗತ್ಯ (ಮೈಕ್ರೋಸೆಕೆಂಡ್ಗಳು)
-
ಡೇಟಾ ಪದೇ ಪದೇ ಬದಲಾಗುತ್ತದೆ (ಲೈವ್ ಪ್ರಶ್ನೆಗಳು)
-
TTL ಮುಕ್ತಾಯ ಅಗತ್ಯ (ಕ್ಯಾಶೆ ಅಮಾನ್ಯಗೊಳಿಸುವಿಕೆ)
-
ಪಬ್/ಸಬ್ ಅಗತ್ಯ (ರಿಯಲ್-ಟೈಮ್ ನವೀಕರಣಗಳು)
-
ವೆಕ್ಟರ್ ಹುಡುಕಾಟ ಅಗತ್ಯ (ರೆಡಿಸರ್ಚ್)
ಉದಾಹರಣೆಗಳು:
-
ಪ್ರಶ್ನೆ ಕ್ಯಾಶೆ
-
ಆಟೋಕಂಪ್ಲೀಟ್
-
ಜನಪ್ರಿಯ ಪ್ರಶ್ನೆಗಳು
-
ಸೆಶನ್ ಡೇಟಾ
-
ರೇಟ್ ಲಿಮಿಟಿಂಗ್
ಹೈಬ್ರಿಡ್ ವಿಧಾನ
ಉತ್ತಮ ಪ್ರದರ್ಶನಕ್ಕಾಗಿ ನಾವು ಮೂರನ್ನೂ ಸಂಯೋಜಿಸುತ್ತೇವೆ:
ಪೈಪ್ಲೈನ್ (ಆಫ್ಲೈನ್ ಪ್ರಕ್ರಿಯೆ)
ನಂಪೈ: ಎಂಬೆಡ್ಡಿಂಗ್ಗಳು, ಹೋಲಿಕೆ ಮ್ಯಾಟ್ರಿಕ್ಸ್ಗಳನ್ನು ಲೆಕ್ಕಾಚಾರ ಮಾಡಿ
JSON: ಮ್ಯಾಪಿಂಗ್ಗಳು, ಮೆಟಾಡೇಟಾ, ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಸಂಗ್ರಹಿಸಿ
ವಾಲ್ಕಿ: ಬಳಸಲಾಗುವುದಿಲ್ಲ (ಪೈಪ್ಲೈನ್ ಆಫ್ಲೈನ್ ಚಲಿಸುತ್ತದೆ)
ಸರ್ಚ್ ಸರ್ವಿಸ್ (ಲೈವ್ ಪ್ರಶ್ನೆಗಳು)
ನಂಪೈ: ಡಿಸ್ಕ್ನಿಂದ ಎಂಬೆಡ್ಡಿಂಗ್ಗಳನ್ನು ಲೋಡ್ ಮಾಡಿ (ಮೆಮೊರಿ-ಮ್ಯಾಪ್ಡ್)
JSON: ಡಿಸ್ಕ್ನಿಂದ ಮ್ಯಾಪಿಂಗ್ಗಳನ್ನು ಲೋಡ್ ಮಾಡಿ (ಮೆಮೊರಿಯಲ್ಲಿ ಕ್ಯಾಶ್ ಮಾಡಲಾಗಿದೆ)
ವಾಲ್ಕಿ: ಲೈವ್ ಪ್ರಶ್ನೆಗಳು, ಆಟೋಕಂಪ್ಲೀಟ್, ಜನಪ್ರಿಯ ಪ್ರಶ್ನೆಗಳನ್ನು ಕ್ಯಾಶೆ ಮಾಡಿ
ಡೇಟಾ ಫ್ಲೋ
graph LR
Pipeline[SEO ಪೈಪ್ಲೈನ್
ಆಫ್ಲೈನ್]
subgraph Storage
NP[ನಂಪೈ ಫೈಲ್ಗಳು
embeddings.npy]
JS[JSON ಫೈಲ್ಗಳು
mappings.json]
end
Search[ಸರ್ಚ್ ಸರ್ವಿಸ್
ಲೈವ್]
VK[ವಾಲ್ಕಿ
ಕ್ಯಾಶೆ]
Pipeline --> NP
Pipeline --> JS
NP --> Search
JS --> Search
Search --> VK
VK --> Searchಪ್ರದರ್ಶನ ಹೋಲಿಕೆ
ನಂಪೈ (ಮೆಮೊರಿ-ಮ್ಯಾಪ್ಡ್):
-
ಲೋಡ್ ಸಮಯ: ತ್ವರಿತ (ವರ್ಚುವಲ್ ಮೆಮೊರಿಗೆ ಶೂನ್ಯ-ಕಾಪಿ ಮ್ಯಾಪಿಂಗ್)
-
ಲುಕ್ಅಪ್ ಸಮಯ: ನಿಯರ್-ಝೀರೋ (ಅರೇ ಇ