docs / stdlib / collection / ltm

Stdlib index
  1. Overview
  1. Captured-borrow migration worklist (3.3.3)
  2. Owned-bind migration worklist (8.2.7)
  3. Return-side title audit — the ride-through enumeration
  4. stdlib ownership audit
  5. stdlib ownership dispositions (plan 1.3.1 / 4.3.1)

aot

  1. Components
  2. Scope
  3. Scoped

codec

  1. Base32
  2. Base64

codec / csv

  1. Csv

codec / json

  1. Json

collection

  1. ArrayList
  2. BPlusTree
  3. Cache
  4. Collectors
  5. HashMap
  6. HashSet
  7. Heap
  8. ImmutableList
  9. ImmutableMap
  10. ImmutableSet
  11. LinkedList
  12. RedBlackTree
  13. Sort

collection / ltm

  1. LtmBPlusTree

concurrent

  1. AtomicInt32
  2. AtomicInt64
  3. Channel
  4. Fiber
  5. FiberLocal
  6. Lock
  7. Mutex
  8. RwLock
  9. Semaphore
  10. Tasks

error

  1. Exception
  2. NoOptionalValueException
  3. NotProvidedException
  4. RecoverableException
  5. ScopedBuildFailedException
  6. ScopeNotActiveException
  7. Throwable
  8. UnrecoverableException

gfx

  1. Sampler
  2. Texture2D

hash

  1. DefaultHasher
  2. Hash
  3. SipHash
  4. XXHash3

ifx

  1. BackendRegistry
  2. Window

io

  1. Buffer

io / file

  1. File
  2. FileInfo
  3. FileReader
  4. FileWriter
  5. Path
  6. Watcher

io / net

  1. BufferPool
  2. ByteBuffer
  3. IpAddress
  4. Server
  5. ServerBuilder
  6. SocketAddress
  7. TcpListener
  8. TcpStream
  9. UdpSocket

io / net / dns

  1. Dns

io / net / uri

  1. Uri
  2. UriBuilder

lang

  1. Guid
  2. Math
  3. Optional
  4. Pair
  5. Slice
  6. String
  7. StringBuilder

lang / stream

  1. ArrayStream
  2. Stream

math

  1. Camera
  2. Color
  3. DType
  4. Ray
  5. Rotation
  6. Tensor
  7. Transform

math / fft

  1. Fft

math / linalg

  1. LinAlg

math / npio

  1. Npy

math / poly

  1. Poly

math / random

  1. Generator

math / stats

  1. Stats

nucleo

  1. Columns — the Arrow-laid-out substrate
  2. Fused tensor expressions — Fuse
  3. Table — the lazy, typed dataframe
  4. Tape — define-by-run autograd
  5. Transform intrinsics — Grad, Vmap, Jit

process

  1. Command
  2. Process

reflect

  1. Class

search / distance

  1. Distance

search / fuzzy

  1. Matcher

search / ngram

  1. Index

session

  1. PackageInstallException
  2. Packages

time

  1. Clock
  2. DateTimeFormatter
  3. Duration
  4. Instant
  5. LocalDate
  6. LocalDateTime
  7. LocalTime
  8. Period
  9. ZonedDateTime
  10. ZoneId
  11. ZoneOffset

wire

  1. Compressor
  2. CompressStream
  3. DecompressionLimitException
  4. Decompressor
  5. Encoder
  6. Schema
  7. SchemaEncoder

xpu

  1. Device
  2. KernelBuffer
  3. KernelStream
  4. KernelTimer

xpu / mesh

  1. MeshSimplifier

LtmBPlusTree<K, V>

cajeta.collection.ltm.LtmBPlusTree — disk-backed, larger-than-memory ordered map: the same B+ tree shape as cajeta.collection.BPlusTree, but every node lives on disk as a page and is paged in on demand by an LtmPager. Only capacity pages are resident at once, so the map can far exceed RAM. The constructor opens (or creates) the index file at path; keyEnc / valEnc are the Encoders that serialize keys and values. Keys are ordered by < / > on K; misses return the type’s zero value. Deletion is tombstone-based: remove marks the entry dead in place (no page merging), every read path skips dead entries, and compact() rewrites the index without its tombstones to reclaim the space. Ordered iteration walks the leaf chain through the pager (scan() / scanFrom(key) return an LtmCursor), so a scan far larger than the resident pool pages in and out as it goes. Always close() (or at least flush()) to make writes durable.

public final class I32Codec implements Encoder<int32> {
    public I32Codec() { }
    public #int8[] encode(int32 v) {
        int8[] b = heap int8[4];
        b[0] = (int8) (v & 0xFF);
        b[1] = (int8) ((v >> 8) & 0xFF);
        b[2] = (int8) ((v >> 16) & 0xFF);
        b[3] = (int8) ((v >> 24) & 0xFF);
        return #b;
    }
    public #int32 decode(int8[] bytes) {
        int32 r = (((int32) bytes[0]) & 0xFF)
            | ((((int32) bytes[1]) & 0xFF) << 8)
            | ((((int32) bytes[2]) & 0xFF) << 16)
            | ((((int32) bytes[3]) & 0xFF) << 24);
        return #r;
    }
}

public class LtmExample {
    public void run() {
        Encoder<int32> ke = heap I32Codec();
        Encoder<int32> ve = heap I32Codec();
        LtmBPlusTree<int32, int32> t =
            heap LtmBPlusTree<int32, int32>("/tmp/example.idx", ke, ve, 32, 64);
        t.put(42, 126);
        int32 v = t.get(42);   // 126
        t.close();             // flush + release — durable
    }
}

Methods

Signature
LtmBPlusTree(String path, Encoder<K> keyEnc, Encoder<V> valEnc, int32 order, int32 capacity) ⚑Open (or create) the disk index at path; a new file is laid out with branching factor order, an existing file is reopened from its header (the stored order wins); capacity caps the resident pages (it must exceed the tree’s depth — a put pins its whole root-to-leaf path)
LtmBPlusTree(String path, Encoder<K> keyEnc, Encoder<V> valEnc, BufferEncoder<K> keyFast, BufferEncoder<V> valFast, int32 order, int32 capacity)The buffer-encoder form: page serialization writes entries with encodeInto — zero allocations per entry; the fast encoders must produce byte-identical output to the Encoders
int64 count()Number of LIVE entries (tombstoned keys are not counted)
boolean isEmpty()True when no entries have been inserted (no root page yet)
void flush()Write all dirty resident pages to disk without closing the file
void close()Flush and release the underlying file; call before discarding the index
void put(K key, V value)Insert or update the entry for key; re-putting a removed key revives it
V get(K key)Value bound to key, or the type’s zero value if absent or removed
boolean containsKey(K key)True iff key is present and live
boolean remove(K key)Tombstone the entry for key; true iff a live entry was removed. Durable like any other write; space returns via compact()
K min()Smallest live key, or the type’s zero value if empty
#LtmCursor<K, V> scan()Ordered cursor over every live entry, ascending; pages through the pool as it walks
#LtmCursor<K, V> scanFrom(K key)Ordered cursor positioned at the first live entry at or after key
void compact()Rewrite the index without its tombstones (streams through a path + ".compact" scratch file, then reopens); bounded memory

⚑ = @EntryPoint

See also

Source: docs/stdlib/collection/ltm/LtmBPlusTree.md · 2 min read · 515 words