Velocity Search Engine implémente plusieurs techniques de compression pour réduire l'empreinte mémoire et améliorer les performances I/O.
Encode efficacement les entiers de taille variable :
from src.indexer.inverted_index import PostingList
# Encoder une liste d'entiers
numbers = [1, 127, 128, 16383]
encoded = PostingList.variable_byte_encode(numbers)
decoded = PostingList.variable_byte_decode(encoded)Avantages : * Compression ~30-50% pour les petits entiers * Décodage rapide (CPU-friendly) * Pas de dépendance externe
Compresse les séquences d'IDs consécutifs :
# Documents IDs : [100, 101, 105, 106, 110]
# Delta encoded : [100, 1, 4, 1, 4]
doc_ids = [100, 101, 105, 106, 110]
deltas = PostingList.delta_encode(doc_ids)
restored = PostingList.delta_decode(deltas)Efficacité : 60-80% réduction pour IDs consécutifs.
Utilise delta + variable byte pour l'efficacité maximale :
posting_list = index.get_postings("python")
# Compression automatique
compressed_data = posting_list.get_doc_ids_compressed()
# Décompression
doc_ids = posting_list.decompress_doc_ids(compressed_data)Le dictionnaire de termes utilise un Trie pour réduire la redondance :
# Mesurer la compression du dictionnaire
original_size = index.get_term_dict_size()
trie_size = index.get_trie_compressed_dict_size()
compression_ratio = original_size / trie_size
print(f"Compression: {compression_ratio:.2f}x")- Activation sélective : Activer la compression seulement pour les gros index (>1M documents)
- Profiling : Mesurer l'impact sur votre dataset spécifique
- Cache : Décompresser et cacher les posting lists fréquemment utilisées
- Batch processing : Décompresser plusieurs posting lists simultanément
class CompressedInvertedIndex(InvertedIndex):
def __init__(self, enable_compression=True):
super().__init__()
self.compression_enabled = enable_compression
def get_postings(self, term):
posting_list = super().get_postings(term)
if self.compression_enabled and posting_list:
# Compression transparente
return posting_list
return posting_list