Skip to main content
Where your data lives is chosen by the connect URI:
Data is stored as standard Apache Parquet at that location, so anything that reads Parquet can read it.
memory:// is in-process and ephemeral. update and delete require durable storage (a path or s3:// URI).

Object-storage configuration

Credentials go in storage_options (storageOptions in Node.js), keyed by the standard object_store config strings — aws_* for S3, azure_* for Azure Blob (the same names the AWS and Azure SDKs use). Infino reads no credentials from the environment; omit them to use ambient cloud identity (an IAM instance role or Azure managed identity).
Common credential keys: The full set is whatever object_store accepts for the backend; an unknown key is rejected at connect. For an S3-compatible endpoint (MinIO / R2 / Ceph), set aws_endpoint (add aws_allow_http: "true" for plain HTTP) alongside the credentials.
Pass validate (with_validate(true) in Rust) to probe the backend during connect, so wrong credentials or an unreachable bucket fail there instead of on the first query. The local cache keeps hot superfiles on disk so warm queries don’t re-fetch from object storage.

Connect options

Connection memory budget

connection_memory_budget_bytes caps the RAM (heap) a connection may hold while it works, the transient memory used to ingest data and run queries over it (keyword, vector, hybrid, or SQL). It is per connection: one ceiling shared by every table on the connection and by all its work, tracked as a single running total. By default it is unset, usage is measured but never enforced; pass a byte value to enforce it. When a request would cross the limit, Infino tries to stay within budget before it fails:
  • SQL that can spill (sorts, aggregations, joins) writes intermediate state to disk and keeps going, so the query still completes, just slower.
  • Work that can’t spill (a vector search’s cold fetch, an ingest build) is refused before it allocates, returning a recoverable error rather than risking an out-of-memory crash.
A refusal surfaces as each language’s idiomatic recoverable error: ConnectionMemoryBudgetError in Python, a thrown Error in Node, and InfinoError::OverBudget in Rust. Catch it, then narrow the query, split the ingest, or raise the budget.
This budget is RAM only. It is separate from cache_budget_bytes, which bounds the local disk cache, and it does not cap memory-mapped reads (the OS reclaims those on its own). Give each independent workload its own connection so their budgets stay isolated rather than sharing one ceiling. Omit it (or pass 0) to only measure usage, never enforce.

Limitations

  • memory:// is ephemeral and can’t be mutated. update/delete need a path or s3:// URI.
  • Object-storage reads are cached locally. Cold queries fetch from the store; size the cache (cache_budget_bytes) for your working set.

See also

Last modified on July 14, 2026