Skip to content

Latest commit

 

History

History
109 lines (73 loc) · 3.1 KB

File metadata and controls

109 lines (73 loc) · 3.1 KB

Index Compression

Velocity Search Engine implémente plusieurs techniques de compression pour réduire l'empreinte mémoire et améliorer les performances I/O.

Variable Byte Encoding

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

Delta Encoding

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.

Combined Compression

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)

Dictionary Compression

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")

Performance Impact

Best Practices

  1. Activation sélective : Activer la compression seulement pour les gros index (>1M documents)
  2. Profiling : Mesurer l'impact sur votre dataset spécifique
  3. Cache : Décompresser et cacher les posting lists fréquemment utilisées
  4. Batch processing : Décompresser plusieurs posting lists simultanément

Configuration Example

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