ಸ್ಟೋರೇಜ್ ತಂತ್ರ: ವಾಲ್ಕಿ 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

ಪ್ರದರ್ಶನ ಹೋಲಿಕೆ

ನಂಪೈ (ಮೆಮೊರಿ-ಮ್ಯಾಪ್ಡ್):

  • ಲೋಡ್ ಸಮಯ: ತ್ವರಿತ (ವರ್ಚುವಲ್ ಮೆಮೊರಿಗೆ ಶೂನ್ಯ-ಕಾಪಿ ಮ್ಯಾಪಿಂಗ್)

  • ಲುಕ್ಅಪ್ ಸಮಯ: ನಿಯರ್-ಝೀರೋ (ಅರೇ ಇ