Skip to main content

Icechunk

Icechunk logo

PyPI Conda Forge Crates.io GitHub Repo stars Earthmover Community Slack


[!TIP] Icechunk 2.0 is released! Better consistency, performance, and reliability for tensor storage


Icechunk is an open-source (Apache 2.0), transactional storage engine for tensor / ND-array data designed for use on cloud object storage. Icechunk works together with Zarr, augmenting the Zarr core data model with features that enhance performance, collaboration, and safety in a cloud-computing context.

Documentation and Resources

Crate Structure

The Rust workspace is organized into layered crates:

graph TD
    python[icechunk-python] --> core[icechunk]
    core --> arrow[icechunk-arrow-object-store]
    core --> s3[icechunk-s3 *optional*]
    core --> storage[icechunk-storage]
    core --> format[icechunk-format]
    arrow --> storage
    s3 --> storage
    storage --> types[icechunk-types]
    format --> types
Crate Description
icechunk-macros Procedural macro helpers for tests and internal use
icechunk-types Shared foundational types (Path, ETag, Move, error wrappers) used across all crates
icechunk-format Binary format types and serialization (snapshots, manifests, transaction logs, repo info)
icechunk-storage Storage trait definitions and common storage utilities
icechunk-arrow-object-store Storage backend using Apache Arrow's object_store (in-memory, local, GCS, Azure, etc.)
icechunk-s3 Native AWS S3 storage backend (optional feature)
icechunk Core storage engine: transactions, version control, repositories
icechunk-python PyO3 bindings exposing the engine to Python

Icechunk Overview

Let's break down what "transactional storage engine for Zarr" actually means:

  • Zarr is an open source specification for the storage of multidimensional array (a.k.a. tensor) data. Zarr defines the metadata for describing arrays (shape, dtype, etc.) and the way these arrays are chunked, compressed, and converted to raw bytes for storage. Zarr can store its data in any key-value store. There are many different implementations of Zarr in different languages. Right now, Icechunk only supports Zarr Python. If you're interested in implementing Icechunk support, please open an issue so we can help you.
  • Storage engine - Icechunk exposes a key-value interface to Zarr and manages all of the actual I/O for getting, setting, and updating both metadata and chunk data in cloud object storage. Zarr libraries don't have to know exactly how icechunk works under the hood in order to use it.
  • Transactional - The key improvement that Icechunk brings on top of regular Zarr is to provide consistent serializable isolation between transactions. This means that Icechunk data is safe to read and write in parallel from multiple uncoordinated processes. This allows Zarr to be used more like a database.

The core entity in Icechunk is a repository or repo. A repo is defined as a Zarr hierarchy containing one or more Arrays and Groups, and a repo functions as a self-contained Zarr Store. The most common scenario is for an Icechunk repo to contain a single Zarr group with multiple arrays, each corresponding to different physical variables but sharing common spatiotemporal coordinates. However, formally a repo can be any valid Zarr hierarchy, from a single Array to a deeply nested structure of Groups and Arrays. Users of Icechunk should aim to scope their repos only to related arrays and groups that require consistent transactional updates.

Icechunk supports the following core requirements:

  1. Object storage - the format is designed around the consistency features and performance characteristics available in modern cloud object storage. No external database or catalog is required to maintain a repo. (It also works with file storage.)
  2. Serializable isolation - Reads are isolated from concurrent writes and always use a committed snapshot of a repo. Writes are committed atomically and are never partially visible. No locks are required for reading.
  3. Time travel - Previous snapshots of a repo remain accessible after new ones have been written.
  4. Data version control - Repos support both tags (immutable references to snapshots) and branches (mutable references to snapshots).
  5. Chunk shardings - Chunk storage is decoupled from specific file names. Multiple chunks can be packed into a single object (sharding).
  6. Chunk references - Zarr-compatible chunks within other file formats (e.g. HDF5, NetCDF) can be referenced.
  7. Schema evolution - Arrays and Groups can be added, renamed, and removed from the hierarchy with minimal overhead.

Key Concepts

Groups, Arrays, and Chunks

Icechunk is designed around the Zarr data model, widely used in scientific computing, data science, and AI / ML. (The Zarr high-level data model is effectively the same as HDF5.) The core data structure in this data model is the array. Arrays have two fundamental properties:

  • shape - a tuple of integers which specify the dimensions of each axis of the array. A 10 x 10 square array would have shape (10, 10)
  • data type - a specification of what type of data is found in each element, e.g. integer, float, etc. Different data types have different precision (e.g. 16-bit integer, 64-bit float, etc.)

In Zarr / Icechunk, arrays are split into chunks. A chunk is the minimum unit of data that must be read / written from storage, and thus choices about chunking have strong implications for performance. Zarr leaves this completely up to the user. Chunk shape should be chosen based on the anticipated data access pattern for each array. An Icechunk array is not bounded by an individual file and is effectively unlimited in size.

For further organization of data, Icechunk supports groups within a single repo. Group are like folders which contain multiple arrays and or other groups. Groups enable data to be organized into hierarchical trees. A common usage pattern is to store multiple arrays in a group representing a NetCDF-style dataset.

Arbitrary JSON-style key-value metadata can be attached to both arrays and groups.

Snapshots

Every update to an Icechunk store creates a new snapshot with a unique ID. Icechunk users must organize their updates into groups of related operations called transactions. For example, appending a new time slice to multiple arrays should be done as a single transaction, comprising the following steps

  1. Update the array metadata to resize the array to accommodate the new elements.
  2. Write new chunks for each array in the group.

While the transaction is in progress, none of these changes will be visible to other users of the store. Once the transaction is committed, a new snapshot is generated. Readers can only see and use committed snapshots.

Branches and Tags

Additionally, snapshots occur in a specific linear (i.e. serializable) order within a branch. A branch is a mutable reference to a snapshot--a pointer that maps the branch name to a snapshot ID. The default branch is main. Every commit to the main branch updates this reference. Icechunk's design protects against the race condition in which two uncoordinated sessions attempt to update the branch at the same time; only one can succeed.

Icechunk also defines tags--immutable references to snapshot. Tags are appropriate for publishing specific releases of a repository or for any application which requires a persistent, immutable identifier to the store state.

Chunk References

Chunk references are "pointers" to chunks that exist in other files--HDF5, NetCDF, GRIB, etc. Icechunk can store these references alongside native Zarr chunks as "virtual datasets". You can then update these virtual datasets incrementally (overwrite chunks, change metadata, etc.) without touching the underling files.

How Does It Work?

!!! Note: For a more detailed explanation, have a look at the Icechunk spec.

Zarr itself works by storing both metadata and chunk data into a abstract store according to a specified system of "keys". For example, a 2D Zarr array called myarray, within a group called mygroup, would generate the following keys:

mygroup/zarr.json
mygroup/myarray/zarr.json
mygroup/myarray/c/0/0
mygroup/myarray/c/0/1

In standard regular Zarr stores, these key map directly to filenames in a filesystem or object keys in an object storage system. When writing data, a Zarr implementation will create these keys and populate them with data. When modifying existing arrays or groups, a Zarr implementation will potentially overwrite existing keys with new data.

This is generally not a problem, as long there is only one person or process coordinating access to the data. However, when multiple uncoordinated readers and writers attempt to access the same Zarr data at the same time, various consistency problems emerge. These consistency problems can occur in both file storage and object storage; they are particularly severe in a cloud setting where Zarr is being used as an active store for data that are frequently changed while also being read.

With Icechunk, we keep the same core Zarr data model, but add a layer of indirection between the Zarr keys and the on-disk storage. The Icechunk library translates between the Zarr keys and the actual on-disk data given the particular context of the user's state. Icechunk defines a series of interconnected metadata and data files that together enable efficient isolated reading and writing of metadata and chunks. Once written, these files are immutable. Icechunk keeps track of every single chunk explicitly in a "chunk manifest".

flowchart TD
    zarr-python[Zarr Library] <-- key / value--> icechunk[Icechunk Library]
    icechunk <-- data / metadata files --> storage[(Object Storage)]

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

icechunk-2.2.0.tar.gz (3.7 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

icechunk-2.2.0-cp312-abi3-win_amd64.whl (16.1 MB view details)

Uploaded CPython 3.12+Windows x86-64

icechunk-2.2.0-cp312-abi3-musllinux_1_2_x86_64.whl (17.6 MB view details)

Uploaded CPython 3.12+musllinux: musl 1.2+ x86-64

icechunk-2.2.0-cp312-abi3-musllinux_1_2_aarch64.whl (17.0 MB view details)

Uploaded CPython 3.12+musllinux: musl 1.2+ ARM64

icechunk-2.2.0-cp312-abi3-manylinux_2_28_aarch64.whl (16.8 MB view details)

Uploaded CPython 3.12+manylinux: glibc 2.28+ ARM64

icechunk-2.2.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (17.1 MB view details)

Uploaded CPython 3.12+manylinux: glibc 2.17+ x86-64

icechunk-2.2.0-cp312-abi3-macosx_11_0_arm64.whl (15.2 MB view details)

Uploaded CPython 3.12+macOS 11.0+ ARM64

icechunk-2.2.0-cp312-abi3-macosx_10_12_x86_64.whl (16.5 MB view details)

Uploaded CPython 3.12+macOS 10.12+ x86-64

File details

Details for the file icechunk-2.2.0.tar.gz.

File metadata

  • Download URL: icechunk-2.2.0.tar.gz
  • Upload date:
  • Size: 3.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.15.0

File hashes

Hashes for icechunk-2.2.0.tar.gz
Algorithm Hash digest
SHA256 50b82ae35064c1f77ef44dcdc77c13164b11c457cb802aafc402402fe4f38010
MD5 ea75d249f7890937f8fa604898a44aee
BLAKE2b-256 7934413821f7318fb4f290ca195600eb5f70a7081477de6b26da8de7c50a0fc0

See more details on using hashes here.

File details

Details for the file icechunk-2.2.0-cp312-abi3-win_amd64.whl.

File metadata

  • Download URL: icechunk-2.2.0-cp312-abi3-win_amd64.whl
  • Upload date:
  • Size: 16.1 MB
  • Tags: CPython 3.12+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.15.0

File hashes

Hashes for icechunk-2.2.0-cp312-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 1fa568d9d0b79777812ba2e2e815623fe0a90ae1945924271d29e31b2027964c
MD5 b7fb6c9bc68b1a15dc46778bb9b7a6f4
BLAKE2b-256 211dc1cc06828f3e8d3903c5d5094244ae968d0caf9ece5faaf7e6ae8ad9a7e6

See more details on using hashes here.

File details

Details for the file icechunk-2.2.0-cp312-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for icechunk-2.2.0-cp312-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c1dbc4fdaa9e3f2ea931a157222f34213f82475283c30a6be1860e77da1b6078
MD5 508776e546c8ea970b98f81ff2158eec
BLAKE2b-256 5bafefabafacb04d644655749fadd470e75620f7fcbaa40a548c6e8bcfc6d72d

See more details on using hashes here.

File details

Details for the file icechunk-2.2.0-cp312-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for icechunk-2.2.0-cp312-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 a2f490636291f92eb47bdff51e655278d4de31bbaa3ea0b19a4a052e73e3a799
MD5 aec4d517f68274d2feb183282c2193d3
BLAKE2b-256 f269454799d15c5c48a3c33fb47dcea0f12b1b6fe64ac5b6e41438a12981d575

See more details on using hashes here.

File details

Details for the file icechunk-2.2.0-cp312-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for icechunk-2.2.0-cp312-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 15998f5e47260d202f6acce0e7cffeb23a440a8c497b1b9ef2700d5729abf077
MD5 b15976e6ee0bac2d7b00e7e414e239ca
BLAKE2b-256 9b0d736023a21f521664f2f8df24e1217930719e87b79574bfb6c4fb0b159861

See more details on using hashes here.

File details

Details for the file icechunk-2.2.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for icechunk-2.2.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 620a22d11632c9b6546073e26601e9d9c8a97609bf3cecb7bac262d4cb819395
MD5 f04f25ce39626669b666d63da5591575
BLAKE2b-256 a3d476b47ea15675eeaec431da49af6f1d4edb0d742f381e0bff9ce0a4868348

See more details on using hashes here.

File details

Details for the file icechunk-2.2.0-cp312-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for icechunk-2.2.0-cp312-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8fb1e8b87aa336ac62c48bd5664c67c1143b4a88974674d9fc8e62985a380ed8
MD5 5a438c88b59ef1e32f0f1cecd99d78ac
BLAKE2b-256 7bc623e1d5beb6859ea6a46b70c5d3dbd76fb9ec820e47e9d3c3e1a48a6571f0

See more details on using hashes here.

File details

Details for the file icechunk-2.2.0-cp312-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for icechunk-2.2.0-cp312-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 6a112b2c2503d2dcdf448c887c54b086515738a039406a4a25d035ce746aaa40
MD5 002d402b409cd8ae20aa5e25b7a92782
BLAKE2b-256 84593f0d8794837ffbb84801a6fddbac2d4769d4fb1fd7f38a399937771ab55a

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

2.2.0 This release

8 files

2.1.2

8 files

2.1.1

8 files

2.1.0

8 files

2.0.6

31 files

2.0.5

31 files

2.0.4

31 files

2.0.3

31 files

2.0.2

31 files

2.0.1

31 files

2.0.0

31 files

1.1.21

60 files

1.1.20

60 files

1.1.19

60 files

1.1.18

60 files

1.1.17

60 files

1.1.16

60 files

1.1.15

60 files

1.1.14

60 files

1.1.13

60 files

1.1.12

47 files

1.1.11

47 files

1.1.10

44 files

1.1.9

44 files

1.1.8

45 files

1.1.7

45 files

1.1.6

45 files

1.1.5

47 files

1.1.4

47 files

1.1.3

47 files

1.1.2

47 files

1.1.1

47 files

1.1.0

47 files

1.0.3

47 files

1.0.2

47 files

1.0.1

47 files

1.0.0

47 files

0.2.18

47 files

0.2.17

47 files

0.2.16

47 files

0.2.15

47 files

0.2.14

47 files

0.2.13

47 files

0.2.12

47 files

0.2.11

47 files

0.2.10

39 files

0.2.9

21 files

0.2.8

47 files

0.2.7

40 files

0.2.6

40 files

0.2.5

40 files

0.2.4

40 files

0.2.3

40 files

0.2.2

40 files

0.2.1

40 files

0.2.0

40 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page