~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/btree_index.py

Show diffs side-by-side

added added

removed removed

Lines of Context:
628
628
    memory except when very large walks are done.
629
629
    """
630
630
 
631
 
    def __init__(self, transport, name, size):
 
631
    def __init__(self, transport, name, size, unlimited_cache=False):
632
632
        """Create a B+Tree index object on the index name.
633
633
 
634
634
        :param transport: The transport to read data for the index from.
638
638
            the initial read (to read the root node header) can be done
639
639
            without over-reading even on empty indices, and on small indices
640
640
            allows single-IO to read the entire index.
 
641
        :param unlimited_cache: If set to True, then instead of using an
 
642
            LRUCache with size _NODE_CACHE_SIZE, we will use a dict and always
 
643
            cache all leaf nodes.
641
644
        """
642
645
        self._transport = transport
643
646
        self._name = name
647
650
        self._root_node = None
648
651
        # Default max size is 100,000 leave values
649
652
        self._leaf_value_cache = None # lru_cache.LRUCache(100*1000)
650
 
        self._leaf_node_cache = lru_cache.LRUCache(_NODE_CACHE_SIZE)
651
 
        # We could limit this, but even a 300k record btree has only 3k leaf
652
 
        # nodes, and only 20 internal nodes. So the default of 100 nodes in an
653
 
        # LRU would mean we always cache everything anyway, no need to pay the
654
 
        # overhead of LRU
655
 
        self._internal_node_cache = fifo_cache.FIFOCache(100)
 
653
        if unlimited_cache:
 
654
            self._leaf_node_cache = {}
 
655
            self._internal_node_cache = {}
 
656
        else:
 
657
            self._leaf_node_cache = lru_cache.LRUCache(_NODE_CACHE_SIZE)
 
658
            # We use a FIFO here just to prevent possible blowout. However, a
 
659
            # 300k record btree has only 3k leaf nodes, and only 20 internal
 
660
            # nodes. A value of 100 scales to ~100*100*100 = 1M records.
 
661
            self._internal_node_cache = fifo_cache.FIFOCache(100)
656
662
        self._key_count = None
657
663
        self._row_lengths = None
658
664
        self._row_offsets = None # Start of each row, [-1] is the end
690
696
                if start_of_leaves is None:
691
697
                    start_of_leaves = self._row_offsets[-2]
692
698
                if node_pos < start_of_leaves:
693
 
                    self._internal_node_cache.add(node_pos, node)
 
699
                    self._internal_node_cache[node_pos] = node
694
700
                else:
695
 
                    self._leaf_node_cache.add(node_pos, node)
 
701
                    self._leaf_node_cache[node_pos] = node
696
702
            found[node_pos] = node
697
703
        return found
698
704