<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blosc Home Page  (Posts about treestore hierarchical structure performance)</title><link>https://blosc.org/</link><description></description><atom:link href="https://blosc.org/categories/treestore-hierarchical-structure-performance.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 &lt;a href="mailto:blosc@blosc.org"&gt;The Blosc Developers&lt;/a&gt; </copyright><lastBuildDate>Mon, 30 Mar 2026 10:58:25 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>TreeStore: Endowing Your Data With Hierarchical Structure</title><link>https://blosc.org/posts/new-treestore-blosc2/</link><dc:creator>Francesc Alted</dc:creator><description>&lt;p&gt;When working with large and complex datasets, having a way to organize your data efficiently is crucial. &lt;code class="docutils literal"&gt;blosc2.TreeStore&lt;/code&gt; is a powerful feature in the &lt;code class="docutils literal"&gt;blosc2&lt;/code&gt; library that allows you to store and manage your compressed arrays in a hierarchical, tree-like structure, much like a filesystem. This container, typically saved with a &lt;code class="docutils literal"&gt;.b2z&lt;/code&gt; extension, can hold not only &lt;code class="docutils literal"&gt;blosc2.NDArray&lt;/code&gt; or &lt;code class="docutils literal"&gt;blosc2.SChunk&lt;/code&gt; objects but also metadata, making it a versatile tool for data organization.&lt;/p&gt;
&lt;section id="what-is-a-treestore"&gt;
&lt;h2&gt;What is a TreeStore?&lt;/h2&gt;
&lt;p&gt;A &lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt; lets you arrange your data into groups (like directories) and datasets (like files). Each dataset is a &lt;code class="docutils literal"&gt;blosc2.NDArray&lt;/code&gt; or &lt;code class="docutils literal"&gt;blosc2.SChunk&lt;/code&gt; instance, benefiting from Blosc2's high-performance compression. This structure is ideal for scenarios where data has a natural hierarchy, such as in scientific experiments, simulations, or any project with multiple related datasets.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="basic-usage-creating-and-populating-a-treestore"&gt;
&lt;h2&gt;Basic Usage: Creating and Populating a TreeStore&lt;/h2&gt;
&lt;p&gt;Creating a &lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt; is straightforward. You can use a &lt;code class="docutils literal"&gt;with&lt;/code&gt; statement to ensure the store is properly managed. Inside the &lt;code class="docutils literal"&gt;with&lt;/code&gt; block, you can create groups and datasets using a path-like syntax.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-1" name="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-1" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_ff33dcf6a8134470a72ef6b0885f98ff-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;blosc2&lt;/span&gt;
&lt;a id="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-2" name="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-2" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_ff33dcf6a8134470a72ef6b0885f98ff-2"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;a id="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-3" name="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-3" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_ff33dcf6a8134470a72ef6b0885f98ff-3"&gt;&lt;/a&gt;
&lt;a id="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-4" name="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-4" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_ff33dcf6a8134470a72ef6b0885f98ff-4"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# Create a new TreeStore&lt;/span&gt;
&lt;a id="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-5" name="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-5" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_ff33dcf6a8134470a72ef6b0885f98ff-5"&gt;&lt;/a&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;blosc2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TreeStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"my_experiment.b2z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"w"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-6" name="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-6" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_ff33dcf6a8134470a72ef6b0885f98ff-6"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# You can store numpy arrays, which are converted to blosc2.NDArray&lt;/span&gt;
&lt;a id="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-7" name="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-7" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_ff33dcf6a8134470a72ef6b0885f98ff-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/dataset0"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-8" name="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-8" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_ff33dcf6a8134470a72ef6b0885f98ff-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-9" name="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-9" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_ff33dcf6a8134470a72ef6b0885f98ff-9"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# Create a group with a dataset that can be a blosc2 NDArray&lt;/span&gt;
&lt;a id="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-10" name="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-10" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_ff33dcf6a8134470a72ef6b0885f98ff-10"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/group1/dataset1"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;blosc2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,))&lt;/span&gt;
&lt;a id="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-11" name="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-11" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_ff33dcf6a8134470a72ef6b0885f98ff-11"&gt;&lt;/a&gt;
&lt;a id="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-12" name="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-12" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_ff33dcf6a8134470a72ef6b0885f98ff-12"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# You can also store blosc2 arrays directly (vlmeta included)&lt;/span&gt;
&lt;a id="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-13" name="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-13" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_ff33dcf6a8134470a72ef6b0885f98ff-13"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;blosc2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linspace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-14" name="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-14" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_ff33dcf6a8134470a72ef6b0885f98ff-14"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vlmeta&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"desc"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"dataset2 metadata"&lt;/span&gt;
&lt;a id="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-15" name="rest_code_ff33dcf6a8134470a72ef6b0885f98ff-15" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_ff33dcf6a8134470a72ef6b0885f98ff-15"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/group1/dataset2"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ext&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In this example, we created a &lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt; in a file named &lt;code class="docutils literal"&gt;my_experiment.b2z&lt;/code&gt;.&lt;/p&gt;
&lt;img alt="/images/new-treestore-blosc2/tree-store-blog.png" class="align-center" src="https://blosc.org/images/new-treestore-blosc2/tree-store-blog.png" style="width: 90%;"&gt;
&lt;p&gt;It contains two groups, &lt;code class="docutils literal"&gt;root&lt;/code&gt; and &lt;code class="docutils literal"&gt;group1&lt;/code&gt;, each holding datasets.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="reading-from-a-treestore"&gt;
&lt;h2&gt;Reading from a TreeStore&lt;/h2&gt;
&lt;p&gt;To access the data, you open the &lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt; in read mode (&lt;code class="docutils literal"&gt;'r'&lt;/code&gt;) and use the same path-like keys to retrieve your arrays.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_82fd3de87985406e98e7a3e464cc1483-1" name="rest_code_82fd3de87985406e98e7a3e464cc1483-1" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_82fd3de87985406e98e7a3e464cc1483-1"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# Open the TreeStore in read-only mode ('r')&lt;/span&gt;
&lt;a id="rest_code_82fd3de87985406e98e7a3e464cc1483-2" name="rest_code_82fd3de87985406e98e7a3e464cc1483-2" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_82fd3de87985406e98e7a3e464cc1483-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;blosc2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TreeStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"my_experiment.b2z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"r"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_82fd3de87985406e98e7a3e464cc1483-3" name="rest_code_82fd3de87985406e98e7a3e464cc1483-3" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_82fd3de87985406e98e7a3e464cc1483-3"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# Access a dataset&lt;/span&gt;
&lt;a id="rest_code_82fd3de87985406e98e7a3e464cc1483-4" name="rest_code_82fd3de87985406e98e7a3e464cc1483-4" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_82fd3de87985406e98e7a3e464cc1483-4"&gt;&lt;/a&gt;    &lt;span class="n"&gt;dataset1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/group1/dataset1"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_82fd3de87985406e98e7a3e464cc1483-5" name="rest_code_82fd3de87985406e98e7a3e464cc1483-5" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_82fd3de87985406e98e7a3e464cc1483-5"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Dataset 1:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dataset1&lt;/span&gt;&lt;span class="p"&gt;[:])&lt;/span&gt;  &lt;span class="c1"&gt;# Use [:] to decompress and get a NumPy array&lt;/span&gt;
&lt;a id="rest_code_82fd3de87985406e98e7a3e464cc1483-6" name="rest_code_82fd3de87985406e98e7a3e464cc1483-6" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_82fd3de87985406e98e7a3e464cc1483-6"&gt;&lt;/a&gt;
&lt;a id="rest_code_82fd3de87985406e98e7a3e464cc1483-7" name="rest_code_82fd3de87985406e98e7a3e464cc1483-7" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_82fd3de87985406e98e7a3e464cc1483-7"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# Access the external array that has been stored internally&lt;/span&gt;
&lt;a id="rest_code_82fd3de87985406e98e7a3e464cc1483-8" name="rest_code_82fd3de87985406e98e7a3e464cc1483-8" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_82fd3de87985406e98e7a3e464cc1483-8"&gt;&lt;/a&gt;    &lt;span class="n"&gt;dataset2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/group1/dataset2"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_82fd3de87985406e98e7a3e464cc1483-9" name="rest_code_82fd3de87985406e98e7a3e464cc1483-9" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_82fd3de87985406e98e7a3e464cc1483-9"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Dataset 2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dataset2&lt;/span&gt;&lt;span class="p"&gt;[:])&lt;/span&gt;
&lt;a id="rest_code_82fd3de87985406e98e7a3e464cc1483-10" name="rest_code_82fd3de87985406e98e7a3e464cc1483-10" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_82fd3de87985406e98e7a3e464cc1483-10"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Dataset 2 metadata:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dataset2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vlmeta&lt;/span&gt;&lt;span class="p"&gt;[:])&lt;/span&gt;
&lt;a id="rest_code_82fd3de87985406e98e7a3e464cc1483-11" name="rest_code_82fd3de87985406e98e7a3e464cc1483-11" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_82fd3de87985406e98e7a3e464cc1483-11"&gt;&lt;/a&gt;
&lt;a id="rest_code_82fd3de87985406e98e7a3e464cc1483-12" name="rest_code_82fd3de87985406e98e7a3e464cc1483-12" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_82fd3de87985406e98e7a3e464cc1483-12"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# List all paths in the store&lt;/span&gt;
&lt;a id="rest_code_82fd3de87985406e98e7a3e464cc1483-13" name="rest_code_82fd3de87985406e98e7a3e464cc1483-13" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_82fd3de87985406e98e7a3e464cc1483-13"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Paths in TreeStore:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_6879b9fb9d5e4ea68614a5fcf35ddbc9-1" name="rest_code_6879b9fb9d5e4ea68614a5fcf35ddbc9-1" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_6879b9fb9d5e4ea68614a5fcf35ddbc9-1"&gt;&lt;/a&gt;Dataset 1: [0 1 2 3 4 5 6 7 8 9]
&lt;a id="rest_code_6879b9fb9d5e4ea68614a5fcf35ddbc9-2" name="rest_code_6879b9fb9d5e4ea68614a5fcf35ddbc9-2" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_6879b9fb9d5e4ea68614a5fcf35ddbc9-2"&gt;&lt;/a&gt;Dataset 2 [0.0000000e+00 1.0001000e-04 2.0002000e-04 ... 9.9979997e-01 9.9989998e-01
&lt;a id="rest_code_6879b9fb9d5e4ea68614a5fcf35ddbc9-3" name="rest_code_6879b9fb9d5e4ea68614a5fcf35ddbc9-3" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_6879b9fb9d5e4ea68614a5fcf35ddbc9-3"&gt;&lt;/a&gt; 1.0000000e+00]
&lt;a id="rest_code_6879b9fb9d5e4ea68614a5fcf35ddbc9-4" name="rest_code_6879b9fb9d5e4ea68614a5fcf35ddbc9-4" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_6879b9fb9d5e4ea68614a5fcf35ddbc9-4"&gt;&lt;/a&gt;Dataset 2 metadata: {b'desc': 'dataset2 metadata'}
&lt;a id="rest_code_6879b9fb9d5e4ea68614a5fcf35ddbc9-5" name="rest_code_6879b9fb9d5e4ea68614a5fcf35ddbc9-5" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_6879b9fb9d5e4ea68614a5fcf35ddbc9-5"&gt;&lt;/a&gt;Paths in TreeStore: ['/group1/dataset2', '/group2', '/group1', '/group2/another_dataset', '/group1/dataset1']
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="advanced-usage-metadata-and-subtrees"&gt;
&lt;h2&gt;Advanced Usage: Metadata and Subtrees&lt;/h2&gt;
&lt;p&gt;&lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt; becomes even more powerful when you use metadata and interact with subtrees (groups).&lt;/p&gt;
&lt;section id="storing-metadata-with-vlmeta"&gt;
&lt;h3&gt;Storing Metadata with &lt;code class="docutils literal"&gt;vlmeta&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;You can attach variable-length metadata (&lt;code class="docutils literal"&gt;vlmeta&lt;/code&gt;) to any group or to the root of the tree. This is useful for storing information like author names, dates, or experiment parameters. &lt;code class="docutils literal"&gt;vlmeta&lt;/code&gt; is essentially a dictionary where you can store your metadata.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_3dd757a16b8f4adea890506944cb515c-1" name="rest_code_3dd757a16b8f4adea890506944cb515c-1" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_3dd757a16b8f4adea890506944cb515c-1"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# Appending metadata to the TreeStore&lt;/span&gt;
&lt;a id="rest_code_3dd757a16b8f4adea890506944cb515c-2" name="rest_code_3dd757a16b8f4adea890506944cb515c-2" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_3dd757a16b8f4adea890506944cb515c-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;blosc2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TreeStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"my_experiment.b2z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"a"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# 'a' for append/modify&lt;/span&gt;
&lt;a id="rest_code_3dd757a16b8f4adea890506944cb515c-3" name="rest_code_3dd757a16b8f4adea890506944cb515c-3" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_3dd757a16b8f4adea890506944cb515c-3"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# Add metadata to the root&lt;/span&gt;
&lt;a id="rest_code_3dd757a16b8f4adea890506944cb515c-4" name="rest_code_3dd757a16b8f4adea890506944cb515c-4" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_3dd757a16b8f4adea890506944cb515c-4"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vlmeta&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"The Blosc Team"&lt;/span&gt;
&lt;a id="rest_code_3dd757a16b8f4adea890506944cb515c-5" name="rest_code_3dd757a16b8f4adea890506944cb515c-5" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_3dd757a16b8f4adea890506944cb515c-5"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vlmeta&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"date"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"2025-08-17"&lt;/span&gt;
&lt;a id="rest_code_3dd757a16b8f4adea890506944cb515c-6" name="rest_code_3dd757a16b8f4adea890506944cb515c-6" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_3dd757a16b8f4adea890506944cb515c-6"&gt;&lt;/a&gt;
&lt;a id="rest_code_3dd757a16b8f4adea890506944cb515c-7" name="rest_code_3dd757a16b8f4adea890506944cb515c-7" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_3dd757a16b8f4adea890506944cb515c-7"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# Add metadata to a group&lt;/span&gt;
&lt;a id="rest_code_3dd757a16b8f4adea890506944cb515c-8" name="rest_code_3dd757a16b8f4adea890506944cb515c-8" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_3dd757a16b8f4adea890506944cb515c-8"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/group1"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vlmeta&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Data from the first run"&lt;/span&gt;
&lt;a id="rest_code_3dd757a16b8f4adea890506944cb515c-9" name="rest_code_3dd757a16b8f4adea890506944cb515c-9" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_3dd757a16b8f4adea890506944cb515c-9"&gt;&lt;/a&gt;
&lt;a id="rest_code_3dd757a16b8f4adea890506944cb515c-10" name="rest_code_3dd757a16b8f4adea890506944cb515c-10" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_3dd757a16b8f4adea890506944cb515c-10"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# Reading metadata&lt;/span&gt;
&lt;a id="rest_code_3dd757a16b8f4adea890506944cb515c-11" name="rest_code_3dd757a16b8f4adea890506944cb515c-11" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_3dd757a16b8f4adea890506944cb515c-11"&gt;&lt;/a&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;blosc2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TreeStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"my_experiment.b2z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"r"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_3dd757a16b8f4adea890506944cb515c-12" name="rest_code_3dd757a16b8f4adea890506944cb515c-12" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_3dd757a16b8f4adea890506944cb515c-12"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Root metadata:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vlmeta&lt;/span&gt;&lt;span class="p"&gt;[:])&lt;/span&gt;
&lt;a id="rest_code_3dd757a16b8f4adea890506944cb515c-13" name="rest_code_3dd757a16b8f4adea890506944cb515c-13" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_3dd757a16b8f4adea890506944cb515c-13"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Group 1 metadata:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/group1"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vlmeta&lt;/span&gt;&lt;span class="p"&gt;[:])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_a87cab1ddc224dc78fb26bd40b0a9f0e-1" name="rest_code_a87cab1ddc224dc78fb26bd40b0a9f0e-1" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_a87cab1ddc224dc78fb26bd40b0a9f0e-1"&gt;&lt;/a&gt;Root metadata: {'author': 'The Blosc Team', 'date': '2025-08-17'}
&lt;a id="rest_code_a87cab1ddc224dc78fb26bd40b0a9f0e-2" name="rest_code_a87cab1ddc224dc78fb26bd40b0a9f0e-2" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_a87cab1ddc224dc78fb26bd40b0a9f0e-2"&gt;&lt;/a&gt;Group 1 metadata: {'description': 'Data from the first run'}
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="working-with-subtrees-groups"&gt;
&lt;h3&gt;Working with Subtrees (Groups)&lt;/h3&gt;
&lt;p&gt;A group object can be retrieved from the &lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt; and treated as a smaller, independent &lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt;. This capability is useful for better organizing your data access code.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_6a601a6cea7c450fb8a60184a07115d7-1" name="rest_code_6a601a6cea7c450fb8a60184a07115d7-1" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_6a601a6cea7c450fb8a60184a07115d7-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;blosc2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TreeStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"my_experiment.b2z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"r"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_6a601a6cea7c450fb8a60184a07115d7-2" name="rest_code_6a601a6cea7c450fb8a60184a07115d7-2" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_6a601a6cea7c450fb8a60184a07115d7-2"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# Get the group as a subtree&lt;/span&gt;
&lt;a id="rest_code_6a601a6cea7c450fb8a60184a07115d7-3" name="rest_code_6a601a6cea7c450fb8a60184a07115d7-3" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_6a601a6cea7c450fb8a60184a07115d7-3"&gt;&lt;/a&gt;    &lt;span class="n"&gt;group1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/group1"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_6a601a6cea7c450fb8a60184a07115d7-4" name="rest_code_6a601a6cea7c450fb8a60184a07115d7-4" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_6a601a6cea7c450fb8a60184a07115d7-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_6a601a6cea7c450fb8a60184a07115d7-5" name="rest_code_6a601a6cea7c450fb8a60184a07115d7-5" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_6a601a6cea7c450fb8a60184a07115d7-5"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# Now you can access datasets relative to this group&lt;/span&gt;
&lt;a id="rest_code_6a601a6cea7c450fb8a60184a07115d7-6" name="rest_code_6a601a6cea7c450fb8a60184a07115d7-6" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_6a601a6cea7c450fb8a60184a07115d7-6"&gt;&lt;/a&gt;    &lt;span class="n"&gt;dataset2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;group1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"dataset2"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_6a601a6cea7c450fb8a60184a07115d7-7" name="rest_code_6a601a6cea7c450fb8a60184a07115d7-7" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_6a601a6cea7c450fb8a60184a07115d7-7"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Dataset 2 from group object:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dataset2&lt;/span&gt;&lt;span class="p"&gt;[:])&lt;/span&gt;
&lt;a id="rest_code_6a601a6cea7c450fb8a60184a07115d7-8" name="rest_code_6a601a6cea7c450fb8a60184a07115d7-8" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_6a601a6cea7c450fb8a60184a07115d7-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_6a601a6cea7c450fb8a60184a07115d7-9" name="rest_code_6a601a6cea7c450fb8a60184a07115d7-9" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_6a601a6cea7c450fb8a60184a07115d7-9"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# You can also list contents relative to the group&lt;/span&gt;
&lt;a id="rest_code_6a601a6cea7c450fb8a60184a07115d7-10" name="rest_code_6a601a6cea7c450fb8a60184a07115d7-10" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_6a601a6cea7c450fb8a60184a07115d7-10"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Contents of group1:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_bbe21ea18456427db50ee81f35f27bd1-1" name="rest_code_bbe21ea18456427db50ee81f35f27bd1-1" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_bbe21ea18456427db50ee81f35f27bd1-1"&gt;&lt;/a&gt;Dataset 2 from group object: [0.0000000e+00 1.0001000e-04 2.0002000e-04 ... 9.9979997e-01 9.9989998e-01
&lt;a id="rest_code_bbe21ea18456427db50ee81f35f27bd1-2" name="rest_code_bbe21ea18456427db50ee81f35f27bd1-2" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_bbe21ea18456427db50ee81f35f27bd1-2"&gt;&lt;/a&gt; 1.0000000e+00]
&lt;a id="rest_code_bbe21ea18456427db50ee81f35f27bd1-3" name="rest_code_bbe21ea18456427db50ee81f35f27bd1-3" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_bbe21ea18456427db50ee81f35f27bd1-3"&gt;&lt;/a&gt;Contents of group1: ['/dataset2', '/dataset1']
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="iterating-through-a-treestore"&gt;
&lt;h2&gt;Iterating Through a TreeStore&lt;/h2&gt;
&lt;p&gt;You can easily iterate through all the nodes in a &lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt; to inspect its contents.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_983450a1ac534db9ac92525c32dd6fb4-1" name="rest_code_983450a1ac534db9ac92525c32dd6fb4-1" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_983450a1ac534db9ac92525c32dd6fb4-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;blosc2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TreeStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"my_experiment.b2z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"r"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_983450a1ac534db9ac92525c32dd6fb4-2" name="rest_code_983450a1ac534db9ac92525c32dd6fb4-2" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_983450a1ac534db9ac92525c32dd6fb4-2"&gt;&lt;/a&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a id="rest_code_983450a1ac534db9ac92525c32dd6fb4-3" name="rest_code_983450a1ac534db9ac92525c32dd6fb4-3" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_983450a1ac534db9ac92525c32dd6fb4-3"&gt;&lt;/a&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;blosc2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NDArray&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a id="rest_code_983450a1ac534db9ac92525c32dd6fb4-4" name="rest_code_983450a1ac534db9ac92525c32dd6fb4-4" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_983450a1ac534db9ac92525c32dd6fb4-4"&gt;&lt;/a&gt;            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"Found dataset at '&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;' with shape &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_983450a1ac534db9ac92525c32dd6fb4-5" name="rest_code_983450a1ac534db9ac92525c32dd6fb4-5" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_983450a1ac534db9ac92525c32dd6fb4-5"&gt;&lt;/a&gt;        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# It's a group&lt;/span&gt;
&lt;a id="rest_code_983450a1ac534db9ac92525c32dd6fb4-6" name="rest_code_983450a1ac534db9ac92525c32dd6fb4-6" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_983450a1ac534db9ac92525c32dd6fb4-6"&gt;&lt;/a&gt;            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"Found group at '&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;' with metadata: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vlmeta&lt;/span&gt;&lt;span class="p"&gt;[:]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_060b41ee1b7047e78c76bb5eadfdb621-1" name="rest_code_060b41ee1b7047e78c76bb5eadfdb621-1" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_060b41ee1b7047e78c76bb5eadfdb621-1"&gt;&lt;/a&gt;Found dataset at '/group1/dataset2' with shape (10000,)
&lt;a id="rest_code_060b41ee1b7047e78c76bb5eadfdb621-2" name="rest_code_060b41ee1b7047e78c76bb5eadfdb621-2" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_060b41ee1b7047e78c76bb5eadfdb621-2"&gt;&lt;/a&gt;Found group at '/group1' with metadata: {'description': 'Data from the first run'}
&lt;a id="rest_code_060b41ee1b7047e78c76bb5eadfdb621-3" name="rest_code_060b41ee1b7047e78c76bb5eadfdb621-3" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_060b41ee1b7047e78c76bb5eadfdb621-3"&gt;&lt;/a&gt;Found dataset at '/group1/dataset1' with shape (10,)
&lt;a id="rest_code_060b41ee1b7047e78c76bb5eadfdb621-4" name="rest_code_060b41ee1b7047e78c76bb5eadfdb621-4" href="https://blosc.org/posts/new-treestore-blosc2/#rest_code_060b41ee1b7047e78c76bb5eadfdb621-4"&gt;&lt;/a&gt;Found dataset at '/dataset0' with shape (100,)
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That's it for this introduction to &lt;code class="docutils literal"&gt;blosc2.TreeStore&lt;/code&gt;! You now know how to create, read, and manipulate a hierarchical data structure that can hold compressed datasets and metadata. You can find the source code for this example in the &lt;a class="reference external" href="https://github.com/Blosc/python-blosc2/blob/main/examples/tree-store-blog.py"&gt;blosc2 repository&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="some-benchmarks"&gt;
&lt;h2&gt;Some Benchmarks&lt;/h2&gt;
&lt;p&gt;&lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt; is based on powerful abstractions from the &lt;code class="docutils literal"&gt;blosc2&lt;/code&gt; library, so it is very fast. Here are some benchmarks comparing &lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt; to other data storage formats, like HDF5 and Zarr. We have used two different configurations: one with small arrays, where sizes follow a normal distribution centered at 10 MB each, and the other with larger arrays, where sizes follow a normal distribution centered at 1 GB each. We have compared the performance of &lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt; against HDF5 and Zarr for both small and large arrays, measuring the time taken to create and read datasets.  For comparing apples with apples, we have used the same compression codec (&lt;code class="docutils literal"&gt;zstd&lt;/code&gt;) and filter (&lt;code class="docutils literal"&gt;shuffle&lt;/code&gt;) for all three formats.&lt;/p&gt;
&lt;p&gt;For assessing different platforms, we have used a desktop with an Intel i9-13900K CPU and 32 GB of RAM, running Ubuntu 25.04, and also a Mac mini with an Apple M4 Pro processor and 24 GB of RAM. The benchmarks were run using &lt;a class="reference external" href="https://github.com/Blosc/python-blosc2/blob/main/bench/large-tree-store.py"&gt;this script&lt;/a&gt;.&lt;/p&gt;
&lt;section id="results-for-the-intel-i9-13900k-desktop"&gt;
&lt;h3&gt;Results for the Intel i9-13900K desktop&lt;/h3&gt;
&lt;p&gt;100 small arrays (around 10 MB each) scenario:&lt;/p&gt;
&lt;img alt="/images/new-treestore-blosc2/benchmark_comparison_b2z-i13900K-10M.png" class="align-center" src="https://blosc.org/images/new-treestore-blosc2/benchmark_comparison_b2z-i13900K-10M.png" style="width: 75%;"&gt;
&lt;p&gt;For the small arrays scenario, we can see that &lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt; is the fastest to create datasets (due to use of multi-threading), but it is slower than HDF5 and Zarr when reading datasets.  The reason for this is two-fold: first, &lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt; is designed to work using multi-threading, so it must setup the necessary threads at the beginning of the read operation, which takes some time; second, &lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt; is using NDArray objects internally, which are using a double partitioning scheme (chunks and blocks) to store the data, which adds some overhead when reading small slices of data. Regarding the space used, &lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt; is the most efficient, very close to HDF5, and significantly more efficient than Zarr.&lt;/p&gt;
&lt;p&gt;100 large arrays (around 1 GB each) scenario:&lt;/p&gt;
&lt;img alt="/images/new-treestore-blosc2/benchmark_comparison_b2z-i13900K-1G.png" class="align-center" src="https://blosc.org/images/new-treestore-blosc2/benchmark_comparison_b2z-i13900K-1G.png" style="width: 75%;"&gt;
&lt;p&gt;When handling larger arrays, &lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt; maintains its lead in creation and full-read performance. Although HDF5 and Zarr offer faster access to small data slices, &lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt; compensates by being the most storage-efficient format, followed by HDF5, with Zarr being the most space-intensive.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="results-for-the-apple-m4-pro-mac-mini"&gt;
&lt;h3&gt;Results for the Apple M4 Pro Mac mini&lt;/h3&gt;
&lt;p&gt;100 small arrays (around 10 MB each) scenario:&lt;/p&gt;
&lt;img alt="/images/new-treestore-blosc2/benchmark_comparison_b2z-MacM4-10M.png" class="align-center" src="https://blosc.org/images/new-treestore-blosc2/benchmark_comparison_b2z-MacM4-10M.png" style="width: 75%;"&gt;
&lt;p&gt;100 large arrays (around 1 GB each) scenario:&lt;/p&gt;
&lt;img alt="/images/new-treestore-blosc2/benchmark_comparison_b2z-MacM4-1G.png" class="align-center" src="https://blosc.org/images/new-treestore-blosc2/benchmark_comparison_b2z-MacM4-1G.png" style="width: 75%;"&gt;
&lt;p&gt;Consistent with the previous results, &lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt; is the most space-efficient format and the fastest for creating and reading datasets, particularly for larger arrays. Its performance is slower than HDF5 and Zarr only when reading small data slices (access time). This can be improved by reducing the number of threads from the default of eight, which lessens the thread setup overhead. For more details on this, see these &lt;a class="reference external" href="https://www.blosc.org/docs/2025-EuroSciPy-Blosc2.pdf"&gt;slides comparing 8-thread vs 1-thread performance&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Notably, the Apple M4 Pro processor shows competitive performance against the Intel i9-13900K CPU, a high-end desktop processor that consumes up to 8x more power. This result underscores the efficiency of the ARM architecture in general and Apple silicon in particular.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In summary, &lt;code class="docutils literal"&gt;blosc2.TreeStore&lt;/code&gt; offers a straightforward yet potent solution for hierarchically organizing compressed datasets. By merging the high-performance compression of &lt;code class="docutils literal"&gt;blosc2.NDArray&lt;/code&gt; and &lt;code class="docutils literal"&gt;blosc2.SChunk&lt;/code&gt; with a flexible, filesystem-like structure and metadata support, it stands out as an excellent choice for managing complex data projects.&lt;/p&gt;
&lt;p&gt;As &lt;code class="docutils literal"&gt;TreeStore&lt;/code&gt; is currently in beta, we welcome feedback and suggestions for its improvement. For further details, please consult the official documentation for &lt;a class="reference external" href="https://www.blosc.org/python-blosc2/reference/tree_store.html#blosc2.TreeStore"&gt;blosc2.TreeStore&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;</description><category>treestore hierarchical structure performance</category><guid>https://blosc.org/posts/new-treestore-blosc2/</guid><pubDate>Sun, 17 Aug 2025 10:33:20 GMT</pubDate></item></channel></rss>