Skip to content

Instantly share code, notes, and snippets.

@rsignell-usgs
Created December 10, 2020 18:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rsignell-usgs/c0b87ed1fa5fc694e665fb789e8381bb to your computer and use it in GitHub Desktop.
Save rsignell-usgs/c0b87ed1fa5fc694e665fb789e8381bb to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Convert lots of small NetCDFs to one big Zarr\n",
"The National Water Model writes a new NetCDF file for each hour, resulting in 8760 files for a year, and 227904 files for the entire 26 year reanalysis (1993-01-01 00:00 - 2018-12-31 23:00). \n",
"\n",
"For small datasets, rechunking the data to Zarr would be as simple as:\n",
"\n",
"```\n",
"import xarray as xr\n",
"ds = xr.open_mfdataset('*.nc')\n",
"ds = ds.chunk({'time':672, 'feature_id':30000})\n",
"ds.to_zarr('all_nc.zarr', consolidated=True)\n",
"```\n",
"For large datasets, this approach is slow and uses too much memory. Here we process the data in batches of 672 time files at a time (one time chunk). \n",
"\n",
"For each batch, we create an xarray dataset with open_mfdataset, then use [rechunker](https://github.com/pangeo-data/rechunker), which creates a rechunked Zarr dataset for that batch. We then append each batch (each time chunk) along the time dimension, building up our overall dataset. \n",
"\n",
"The nice part of this approach is that if something goes wrong with the batch, we can fix the problem and just carry on appending."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import xarray as xr\n",
"import pandas as pd\n",
"import numcodecs\n",
"from dask.distributed import Client, progress, LocalCluster, performance_report\n",
"import zarr\n",
"import time\n",
"import shutil"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"os.chdir('/usgs/gamone/data2/rsignell/data/NWM2')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Build a list of filenames for open_mfdataset"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"dates = pd.date_range(start='1993-01-01 00:00',end='2018-12-31 23:00', freq='1h')\n",
"\n",
"files = ['./nc/{}/{}.CHRTOUT_DOMAIN1.comp'.format(date.strftime('%Y'),date.strftime('%Y%m%d%H%M')) for date in dates]"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"227904"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(files)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"dset = xr.open_dataset(files[0])"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
"<defs>\n",
"<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n",
"<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n",
"<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
"<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
"</symbol>\n",
"<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n",
"<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n",
"<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"</symbol>\n",
"</defs>\n",
"</svg>\n",
"<style>/* CSS stylesheet for displaying xarray objects in jupyterlab.\n",
" *\n",
" */\n",
"\n",
":root {\n",
" --xr-font-color0: var(--jp-content-font-color0, rgba(0, 0, 0, 1));\n",
" --xr-font-color2: var(--jp-content-font-color2, rgba(0, 0, 0, 0.54));\n",
" --xr-font-color3: var(--jp-content-font-color3, rgba(0, 0, 0, 0.38));\n",
" --xr-border-color: var(--jp-border-color2, #e0e0e0);\n",
" --xr-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
" --xr-background-color: var(--jp-layout-color0, white);\n",
" --xr-background-color-row-even: var(--jp-layout-color1, white);\n",
" --xr-background-color-row-odd: var(--jp-layout-color2, #eeeeee);\n",
"}\n",
"\n",
"html[theme=dark],\n",
"body.vscode-dark {\n",
" --xr-font-color0: rgba(255, 255, 255, 1);\n",
" --xr-font-color2: rgba(255, 255, 255, 0.54);\n",
" --xr-font-color3: rgba(255, 255, 255, 0.38);\n",
" --xr-border-color: #1F1F1F;\n",
" --xr-disabled-color: #515151;\n",
" --xr-background-color: #111111;\n",
" --xr-background-color-row-even: #111111;\n",
" --xr-background-color-row-odd: #313131;\n",
"}\n",
"\n",
".xr-wrap {\n",
" display: block;\n",
" min-width: 300px;\n",
" max-width: 700px;\n",
"}\n",
"\n",
".xr-text-repr-fallback {\n",
" /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
" display: none;\n",
"}\n",
"\n",
".xr-header {\n",
" padding-top: 6px;\n",
" padding-bottom: 6px;\n",
" margin-bottom: 4px;\n",
" border-bottom: solid 1px var(--xr-border-color);\n",
"}\n",
"\n",
".xr-header > div,\n",
".xr-header > ul {\n",
" display: inline;\n",
" margin-top: 0;\n",
" margin-bottom: 0;\n",
"}\n",
"\n",
".xr-obj-type,\n",
".xr-array-name {\n",
" margin-left: 2px;\n",
" margin-right: 10px;\n",
"}\n",
"\n",
".xr-obj-type {\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-sections {\n",
" padding-left: 0 !important;\n",
" display: grid;\n",
" grid-template-columns: 150px auto auto 1fr 20px 20px;\n",
"}\n",
"\n",
".xr-section-item {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-section-item input {\n",
" display: none;\n",
"}\n",
"\n",
".xr-section-item input + label {\n",
" color: var(--xr-disabled-color);\n",
"}\n",
"\n",
".xr-section-item input:enabled + label {\n",
" cursor: pointer;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-section-item input:enabled + label:hover {\n",
" color: var(--xr-font-color0);\n",
"}\n",
"\n",
".xr-section-summary {\n",
" grid-column: 1;\n",
" color: var(--xr-font-color2);\n",
" font-weight: 500;\n",
"}\n",
"\n",
".xr-section-summary > span {\n",
" display: inline-block;\n",
" padding-left: 0.5em;\n",
"}\n",
"\n",
".xr-section-summary-in:disabled + label {\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-section-summary-in + label:before {\n",
" display: inline-block;\n",
" content: '►';\n",
" font-size: 11px;\n",
" width: 15px;\n",
" text-align: center;\n",
"}\n",
"\n",
".xr-section-summary-in:disabled + label:before {\n",
" color: var(--xr-disabled-color);\n",
"}\n",
"\n",
".xr-section-summary-in:checked + label:before {\n",
" content: '▼';\n",
"}\n",
"\n",
".xr-section-summary-in:checked + label > span {\n",
" display: none;\n",
"}\n",
"\n",
".xr-section-summary,\n",
".xr-section-inline-details {\n",
" padding-top: 4px;\n",
" padding-bottom: 4px;\n",
"}\n",
"\n",
".xr-section-inline-details {\n",
" grid-column: 2 / -1;\n",
"}\n",
"\n",
".xr-section-details {\n",
" display: none;\n",
" grid-column: 1 / -1;\n",
" margin-bottom: 5px;\n",
"}\n",
"\n",
".xr-section-summary-in:checked ~ .xr-section-details {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-array-wrap {\n",
" grid-column: 1 / -1;\n",
" display: grid;\n",
" grid-template-columns: 20px auto;\n",
"}\n",
"\n",
".xr-array-wrap > label {\n",
" grid-column: 1;\n",
" vertical-align: top;\n",
"}\n",
"\n",
".xr-preview {\n",
" color: var(--xr-font-color3);\n",
"}\n",
"\n",
".xr-array-preview,\n",
".xr-array-data {\n",
" padding: 0 5px !important;\n",
" grid-column: 2;\n",
"}\n",
"\n",
".xr-array-data,\n",
".xr-array-in:checked ~ .xr-array-preview {\n",
" display: none;\n",
"}\n",
"\n",
".xr-array-in:checked ~ .xr-array-data,\n",
".xr-array-preview {\n",
" display: inline-block;\n",
"}\n",
"\n",
".xr-dim-list {\n",
" display: inline-block !important;\n",
" list-style: none;\n",
" padding: 0 !important;\n",
" margin: 0;\n",
"}\n",
"\n",
".xr-dim-list li {\n",
" display: inline-block;\n",
" padding: 0;\n",
" margin: 0;\n",
"}\n",
"\n",
".xr-dim-list:before {\n",
" content: '(';\n",
"}\n",
"\n",
".xr-dim-list:after {\n",
" content: ')';\n",
"}\n",
"\n",
".xr-dim-list li:not(:last-child):after {\n",
" content: ',';\n",
" padding-right: 5px;\n",
"}\n",
"\n",
".xr-has-index {\n",
" font-weight: bold;\n",
"}\n",
"\n",
".xr-var-list,\n",
".xr-var-item {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-var-item > div,\n",
".xr-var-item label,\n",
".xr-var-item > .xr-var-name span {\n",
" background-color: var(--xr-background-color-row-even);\n",
" margin-bottom: 0;\n",
"}\n",
"\n",
".xr-var-item > .xr-var-name:hover span {\n",
" padding-right: 5px;\n",
"}\n",
"\n",
".xr-var-list > li:nth-child(odd) > div,\n",
".xr-var-list > li:nth-child(odd) > label,\n",
".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n",
" background-color: var(--xr-background-color-row-odd);\n",
"}\n",
"\n",
".xr-var-name {\n",
" grid-column: 1;\n",
"}\n",
"\n",
".xr-var-dims {\n",
" grid-column: 2;\n",
"}\n",
"\n",
".xr-var-dtype {\n",
" grid-column: 3;\n",
" text-align: right;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-var-preview {\n",
" grid-column: 4;\n",
"}\n",
"\n",
".xr-var-name,\n",
".xr-var-dims,\n",
".xr-var-dtype,\n",
".xr-preview,\n",
".xr-attrs dt {\n",
" white-space: nowrap;\n",
" overflow: hidden;\n",
" text-overflow: ellipsis;\n",
" padding-right: 10px;\n",
"}\n",
"\n",
".xr-var-name:hover,\n",
".xr-var-dims:hover,\n",
".xr-var-dtype:hover,\n",
".xr-attrs dt:hover {\n",
" overflow: visible;\n",
" width: auto;\n",
" z-index: 1;\n",
"}\n",
"\n",
".xr-var-attrs,\n",
".xr-var-data {\n",
" display: none;\n",
" background-color: var(--xr-background-color) !important;\n",
" padding-bottom: 5px !important;\n",
"}\n",
"\n",
".xr-var-attrs-in:checked ~ .xr-var-attrs,\n",
".xr-var-data-in:checked ~ .xr-var-data {\n",
" display: block;\n",
"}\n",
"\n",
".xr-var-data > table {\n",
" float: right;\n",
"}\n",
"\n",
".xr-var-name span,\n",
".xr-var-data,\n",
".xr-attrs {\n",
" padding-left: 25px !important;\n",
"}\n",
"\n",
".xr-attrs,\n",
".xr-var-attrs,\n",
".xr-var-data {\n",
" grid-column: 1 / -1;\n",
"}\n",
"\n",
"dl.xr-attrs {\n",
" padding: 0;\n",
" margin: 0;\n",
" display: grid;\n",
" grid-template-columns: 125px auto;\n",
"}\n",
"\n",
".xr-attrs dt, dd {\n",
" padding: 0;\n",
" margin: 0;\n",
" float: left;\n",
" padding-right: 10px;\n",
" width: auto;\n",
"}\n",
"\n",
".xr-attrs dt {\n",
" font-weight: normal;\n",
" grid-column: 1;\n",
"}\n",
"\n",
".xr-attrs dt:hover span {\n",
" display: inline-block;\n",
" background: var(--xr-background-color);\n",
" padding-right: 10px;\n",
"}\n",
"\n",
".xr-attrs dd {\n",
" grid-column: 2;\n",
" white-space: pre-wrap;\n",
" word-break: break-all;\n",
"}\n",
"\n",
".xr-icon-database,\n",
".xr-icon-file-text2 {\n",
" display: inline-block;\n",
" vertical-align: middle;\n",
" width: 1em;\n",
" height: 1.5em !important;\n",
" stroke-width: 0;\n",
" stroke: currentColor;\n",
" fill: currentColor;\n",
"}\n",
"</style><pre class='xr-text-repr-fallback'>&lt;xarray.Dataset&gt;\n",
"Dimensions: (feature_id: 2729077, reference_time: 1, time: 1)\n",
"Coordinates:\n",
" * time (time) datetime64[ns] 1993-01-01\n",
" * reference_time (reference_time) datetime64[ns] 1992-11-01\n",
" * feature_id (feature_id) int32 101 179 181 ... 1180001803 1180001804\n",
" latitude (feature_id) float32 ...\n",
" longitude (feature_id) float32 ...\n",
"Data variables:\n",
" crs |S1 b&#x27;&#x27;\n",
" order (feature_id) int32 ...\n",
" elevation (feature_id) float32 ...\n",
" streamflow (feature_id) float64 ...\n",
" q_lateral (feature_id) float64 ...\n",
" velocity (feature_id) float64 ...\n",
" qSfcLatRunoff (feature_id) float64 ...\n",
" qBucket (feature_id) float64 ...\n",
" qBtmVertRunoff (feature_id) float64 ...\n",
"Attributes:\n",
" featureType: timeSeries\n",
" proj4: +proj=lcc +units=m +a=6370000.0 +b=6370000.0 ...\n",
" model_initialization_time: 1992-11-01_00:00:00\n",
" station_dimension: feature_id\n",
" model_output_valid_time: 1993-01-01_00:00:00\n",
" model_total_valid_times: 1464\n",
" stream_order_output: 1\n",
" cdm_datatype: Station\n",
" Conventions: CF-1.6\n",
" code_version: v5.1.0-alpha11\n",
" model_output_type: channel_rt\n",
" model_configuration: retrospective\n",
" dev_OVRTSWCRT: 1\n",
" dev_NOAH_TIMESTEP: 3600\n",
" dev_channel_only: 0\n",
" dev_channelBucket_only: 0\n",
" dev: dev_ prefix indicates development/internal me...</pre><div class='xr-wrap' hidden><div class='xr-header'><div class='xr-obj-type'>xarray.Dataset</div></div><ul class='xr-sections'><li class='xr-section-item'><input id='section-c4051d78-494f-42a8-bc26-074ec1a92956' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-c4051d78-494f-42a8-bc26-074ec1a92956' class='xr-section-summary' title='Expand/collapse section'>Dimensions:</label><div class='xr-section-inline-details'><ul class='xr-dim-list'><li><span class='xr-has-index'>feature_id</span>: 2729077</li><li><span class='xr-has-index'>reference_time</span>: 1</li><li><span class='xr-has-index'>time</span>: 1</li></ul></div><div class='xr-section-details'></div></li><li class='xr-section-item'><input id='section-ff249faa-e5e2-40f7-bea4-b6929dd5614e' class='xr-section-summary-in' type='checkbox' checked><label for='section-ff249faa-e5e2-40f7-bea4-b6929dd5614e' class='xr-section-summary' >Coordinates: <span>(5)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>time</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>datetime64[ns]</div><div class='xr-var-preview xr-preview'>1993-01-01</div><input id='attrs-93ba34b5-dd70-4646-9235-31fc5650bdc8' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-93ba34b5-dd70-4646-9235-31fc5650bdc8' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-65d6a718-05d0-4203-a1e3-3023dd76d554' class='xr-var-data-in' type='checkbox'><label for='data-65d6a718-05d0-4203-a1e3-3023dd76d554' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>valid output time</dd><dt><span>standard_name :</span></dt><dd>time</dd><dt><span>valid_min :</span></dt><dd>12009660</dd><dt><span>valid_max :</span></dt><dd>12097440</dd></dl></div><div class='xr-var-data'><pre>array([&#x27;1993-01-01T00:00:00.000000000&#x27;], dtype=&#x27;datetime64[ns]&#x27;)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>reference_time</span></div><div class='xr-var-dims'>(reference_time)</div><div class='xr-var-dtype'>datetime64[ns]</div><div class='xr-var-preview xr-preview'>1992-11-01</div><input id='attrs-6ddc08fb-b9b0-4640-8d42-1c75fde356bb' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-6ddc08fb-b9b0-4640-8d42-1c75fde356bb' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-dd011c49-6eb2-4690-9eca-85fd39cc19e6' class='xr-var-data-in' type='checkbox'><label for='data-dd011c49-6eb2-4690-9eca-85fd39cc19e6' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>model initialization time</dd><dt><span>standard_name :</span></dt><dd>forecast_reference_time</dd></dl></div><div class='xr-var-data'><pre>array([&#x27;1992-11-01T00:00:00.000000000&#x27;], dtype=&#x27;datetime64[ns]&#x27;)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>feature_id</span></div><div class='xr-var-dims'>(feature_id)</div><div class='xr-var-dtype'>int32</div><div class='xr-var-preview xr-preview'>101 179 ... 1180001803 1180001804</div><input id='attrs-bc5eec98-6e02-43ee-a679-0bbfa9ece9b0' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-bc5eec98-6e02-43ee-a679-0bbfa9ece9b0' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-b7c3e993-3716-48af-b97e-e6bdc718db69' class='xr-var-data-in' type='checkbox'><label for='data-b7c3e993-3716-48af-b97e-e6bdc718db69' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>Reach ID</dd><dt><span>comment :</span></dt><dd>Gage Points Specified by User in Routelink file</dd><dt><span>cf_role :</span></dt><dd>timeseries_id</dd></dl></div><div class='xr-var-data'><pre>array([ 101, 179, 181, ..., 1180001802, 1180001803,\n",
" 1180001804], dtype=int32)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>latitude</span></div><div class='xr-var-dims'>(feature_id)</div><div class='xr-var-dtype'>float32</div><div class='xr-var-preview xr-preview'>...</div><input id='attrs-cf6921d2-3c2b-43b1-bbe5-d035253d82d0' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-cf6921d2-3c2b-43b1-bbe5-d035253d82d0' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-b3ec1c9d-3b74-43bd-b3ec-e7bd0b5e7782' class='xr-var-data-in' type='checkbox'><label for='data-b3ec1c9d-3b74-43bd-b3ec-e7bd0b5e7782' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>Feature latitude</dd><dt><span>standard_name :</span></dt><dd>latitude</dd><dt><span>units :</span></dt><dd>degrees_north</dd></dl></div><div class='xr-var-data'><pre>[2729077 values with dtype=float32]</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>longitude</span></div><div class='xr-var-dims'>(feature_id)</div><div class='xr-var-dtype'>float32</div><div class='xr-var-preview xr-preview'>...</div><input id='attrs-16e6b7fa-90f0-4324-85d1-6336cafc2934' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-16e6b7fa-90f0-4324-85d1-6336cafc2934' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-78f19b04-9fec-4b75-a42b-e674aaa13e8e' class='xr-var-data-in' type='checkbox'><label for='data-78f19b04-9fec-4b75-a42b-e674aaa13e8e' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>Feature longitude</dd><dt><span>standard_name :</span></dt><dd>longitude</dd><dt><span>units :</span></dt><dd>degrees_east</dd></dl></div><div class='xr-var-data'><pre>[2729077 values with dtype=float32]</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-e1a1d8ee-a1bd-4780-85a3-dfef2cea7a66' class='xr-section-summary-in' type='checkbox' checked><label for='section-e1a1d8ee-a1bd-4780-85a3-dfef2cea7a66' class='xr-section-summary' >Data variables: <span>(9)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>crs</span></div><div class='xr-var-dims'>()</div><div class='xr-var-dtype'>|S1</div><div class='xr-var-preview xr-preview'>...</div><input id='attrs-1aa14f3f-a40b-496d-a5cc-bc151dd630f8' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-1aa14f3f-a40b-496d-a5cc-bc151dd630f8' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-bcd611d9-9931-4faf-8b29-f728680628b6' class='xr-var-data-in' type='checkbox'><label for='data-bcd611d9-9931-4faf-8b29-f728680628b6' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>transform_name :</span></dt><dd>latitude longitude</dd><dt><span>grid_mapping_name :</span></dt><dd>latitude longitude</dd><dt><span>esri_pe_string :</span></dt><dd>GEOGCS[&quot;GCS_WGS_1984&quot;,DATUM[&quot;D_WGS_1984&quot;,SPHEROID[&quot;WGS_1984&quot;,6378137.0,298.257223563]],PRIMEM[&quot;Greenwich&quot;,0.0],UNIT[&quot;Degree&quot;,0.0174532925199433]];-400 -400 1000000000;-100000 10000;-100000 10000;8.98315284119521E-09;0.001;0.001;IsHighPrecision</dd><dt><span>spatial_ref :</span></dt><dd>GEOGCS[&quot;GCS_WGS_1984&quot;,DATUM[&quot;D_WGS_1984&quot;,SPHEROID[&quot;WGS_1984&quot;,6378137.0,298.257223563]],PRIMEM[&quot;Greenwich&quot;,0.0],UNIT[&quot;Degree&quot;,0.0174532925199433]];-400 -400 1000000000;-100000 10000;-100000 10000;8.98315284119521E-09;0.001;0.001;IsHighPrecision</dd><dt><span>long_name :</span></dt><dd>CRS definition</dd><dt><span>longitude_of_prime_meridian :</span></dt><dd>0.0</dd><dt><span>_CoordinateAxes :</span></dt><dd>latitude longitude</dd><dt><span>semi_major_axis :</span></dt><dd>6378137.0</dd><dt><span>semi_minor_axis :</span></dt><dd>6356752.5</dd><dt><span>inverse_flattening :</span></dt><dd>298.25723</dd></dl></div><div class='xr-var-data'><pre>array(b&#x27;&#x27;, dtype=&#x27;|S1&#x27;)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>order</span></div><div class='xr-var-dims'>(feature_id)</div><div class='xr-var-dtype'>int32</div><div class='xr-var-preview xr-preview'>...</div><input id='attrs-e7a2698f-066a-4af7-b6c1-cba49b44268c' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-e7a2698f-066a-4af7-b6c1-cba49b44268c' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-6b726e4c-1c76-4935-bf4b-fba8294b550a' class='xr-var-data-in' type='checkbox'><label for='data-6b726e4c-1c76-4935-bf4b-fba8294b550a' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>Streamflow Order</dd><dt><span>standard_name :</span></dt><dd>order</dd></dl></div><div class='xr-var-data'><pre>[2729077 values with dtype=int32]</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>elevation</span></div><div class='xr-var-dims'>(feature_id)</div><div class='xr-var-dtype'>float32</div><div class='xr-var-preview xr-preview'>...</div><input id='attrs-e1be5495-4872-4ee6-8f5b-7c057ad8a8b5' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-e1be5495-4872-4ee6-8f5b-7c057ad8a8b5' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-e8dd908b-ddc7-4bbd-8f5e-6063af0204e8' class='xr-var-data-in' type='checkbox'><label for='data-e8dd908b-ddc7-4bbd-8f5e-6063af0204e8' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>Feature Elevation</dd><dt><span>standard_name :</span></dt><dd>Elevation</dd><dt><span>units :</span></dt><dd>meters</dd></dl></div><div class='xr-var-data'><pre>[2729077 values with dtype=float32]</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>streamflow</span></div><div class='xr-var-dims'>(feature_id)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>...</div><input id='attrs-d660c258-2f94-4e7d-819c-802f203df22e' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-d660c258-2f94-4e7d-819c-802f203df22e' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-0df8935c-1cbd-440b-bb1f-03d4a6f4cb00' class='xr-var-data-in' type='checkbox'><label for='data-0df8935c-1cbd-440b-bb1f-03d4a6f4cb00' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>River Flow</dd><dt><span>units :</span></dt><dd>m3 s-1</dd><dt><span>grid_mapping :</span></dt><dd>crs</dd><dt><span>valid_range :</span></dt><dd>[ 0 50000000]</dd></dl></div><div class='xr-var-data'><pre>[2729077 values with dtype=float64]</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>q_lateral</span></div><div class='xr-var-dims'>(feature_id)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>...</div><input id='attrs-843671c6-74b3-4000-8950-3ccf03a7e083' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-843671c6-74b3-4000-8950-3ccf03a7e083' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-04f0c0b5-3477-44c1-a3a7-ede346dbc523' class='xr-var-data-in' type='checkbox'><label for='data-04f0c0b5-3477-44c1-a3a7-ede346dbc523' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>Runoff into channel reach</dd><dt><span>units :</span></dt><dd>m3 s-1</dd><dt><span>grid_mapping :</span></dt><dd>crs</dd><dt><span>valid_range :</span></dt><dd>[ 0 5000000]</dd></dl></div><div class='xr-var-data'><pre>[2729077 values with dtype=float64]</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>velocity</span></div><div class='xr-var-dims'>(feature_id)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>...</div><input id='attrs-b06a6d9a-037e-4923-a770-9210d6b05203' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-b06a6d9a-037e-4923-a770-9210d6b05203' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-560f4ef1-d5f7-4160-a695-1be7325230c9' class='xr-var-data-in' type='checkbox'><label for='data-560f4ef1-d5f7-4160-a695-1be7325230c9' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>River Velocity</dd><dt><span>units :</span></dt><dd>ms-1</dd><dt><span>grid_mapping :</span></dt><dd>crs</dd><dt><span>valid_range :</span></dt><dd>[ 0 50000000]</dd></dl></div><div class='xr-var-data'><pre>[2729077 values with dtype=float64]</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>qSfcLatRunoff</span></div><div class='xr-var-dims'>(feature_id)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>...</div><input id='attrs-8cf45295-faf7-4a0c-baf4-a32efbcd7d8c' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-8cf45295-faf7-4a0c-baf4-a32efbcd7d8c' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-70fce9bc-6d47-47d1-ba4f-e8910a612618' class='xr-var-data-in' type='checkbox'><label for='data-70fce9bc-6d47-47d1-ba4f-e8910a612618' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>Runoff from terrain routing</dd><dt><span>units :</span></dt><dd>m3 s-1</dd><dt><span>grid_mapping :</span></dt><dd>crs</dd><dt><span>valid_range :</span></dt><dd>[ 0 -2147483648]</dd></dl></div><div class='xr-var-data'><pre>[2729077 values with dtype=float64]</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>qBucket</span></div><div class='xr-var-dims'>(feature_id)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>...</div><input id='attrs-d6cca3c2-5b99-4a36-b220-655773e49742' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-d6cca3c2-5b99-4a36-b220-655773e49742' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-9f53ab7a-4585-4b99-85f3-441521760ad6' class='xr-var-data-in' type='checkbox'><label for='data-9f53ab7a-4585-4b99-85f3-441521760ad6' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>Flux from gw bucket</dd><dt><span>units :</span></dt><dd>m3 s-1</dd><dt><span>grid_mapping :</span></dt><dd>crs</dd><dt><span>valid_range :</span></dt><dd>[ 0 -2147483648]</dd></dl></div><div class='xr-var-data'><pre>[2729077 values with dtype=float64]</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>qBtmVertRunoff</span></div><div class='xr-var-dims'>(feature_id)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>...</div><input id='attrs-89eab4ea-b91c-45ac-831f-f58a50d24e01' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-89eab4ea-b91c-45ac-831f-f58a50d24e01' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-40baa16d-6af5-4c05-9a32-4080179d0442' class='xr-var-data-in' type='checkbox'><label for='data-40baa16d-6af5-4c05-9a32-4080179d0442' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>Runoff from bottom of soil to bucket</dd><dt><span>units :</span></dt><dd>m3</dd><dt><span>grid_mapping :</span></dt><dd>crs</dd><dt><span>valid_range :</span></dt><dd>[ 0 499999968]</dd></dl></div><div class='xr-var-data'><pre>[2729077 values with dtype=float64]</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-0767161d-9423-4887-afa0-f4c890b87e1f' class='xr-section-summary-in' type='checkbox' ><label for='section-0767161d-9423-4887-afa0-f4c890b87e1f' class='xr-section-summary' >Attributes: <span>(17)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'><dt><span>featureType :</span></dt><dd>timeSeries</dd><dt><span>proj4 :</span></dt><dd>+proj=lcc +units=m +a=6370000.0 +b=6370000.0 +lat_1=30.0 +lat_2=60.0 +lat_0=40.0 +lon_0=-97.0 +x_0=0 +y_0=0 +k_0=1.0 +nadgrids=@</dd><dt><span>model_initialization_time :</span></dt><dd>1992-11-01_00:00:00</dd><dt><span>station_dimension :</span></dt><dd>feature_id</dd><dt><span>model_output_valid_time :</span></dt><dd>1993-01-01_00:00:00</dd><dt><span>model_total_valid_times :</span></dt><dd>1464</dd><dt><span>stream_order_output :</span></dt><dd>1</dd><dt><span>cdm_datatype :</span></dt><dd>Station</dd><dt><span>Conventions :</span></dt><dd>CF-1.6</dd><dt><span>code_version :</span></dt><dd>v5.1.0-alpha11</dd><dt><span>model_output_type :</span></dt><dd>channel_rt</dd><dt><span>model_configuration :</span></dt><dd>retrospective</dd><dt><span>dev_OVRTSWCRT :</span></dt><dd>1</dd><dt><span>dev_NOAH_TIMESTEP :</span></dt><dd>3600</dd><dt><span>dev_channel_only :</span></dt><dd>0</dd><dt><span>dev_channelBucket_only :</span></dt><dd>0</dd><dt><span>dev :</span></dt><dd>dev_ prefix indicates development/internal meta data</dd></dl></div></li></ul></div></div>"
],
"text/plain": [
"<xarray.Dataset>\n",
"Dimensions: (feature_id: 2729077, reference_time: 1, time: 1)\n",
"Coordinates:\n",
" * time (time) datetime64[ns] 1993-01-01\n",
" * reference_time (reference_time) datetime64[ns] 1992-11-01\n",
" * feature_id (feature_id) int32 101 179 181 ... 1180001803 1180001804\n",
" latitude (feature_id) float32 ...\n",
" longitude (feature_id) float32 ...\n",
"Data variables:\n",
" crs |S1 ...\n",
" order (feature_id) int32 ...\n",
" elevation (feature_id) float32 ...\n",
" streamflow (feature_id) float64 ...\n",
" q_lateral (feature_id) float64 ...\n",
" velocity (feature_id) float64 ...\n",
" qSfcLatRunoff (feature_id) float64 ...\n",
" qBucket (feature_id) float64 ...\n",
" qBtmVertRunoff (feature_id) float64 ...\n",
"Attributes:\n",
" featureType: timeSeries\n",
" proj4: +proj=lcc +units=m +a=6370000.0 +b=6370000.0 ...\n",
" model_initialization_time: 1992-11-01_00:00:00\n",
" station_dimension: feature_id\n",
" model_output_valid_time: 1993-01-01_00:00:00\n",
" model_total_valid_times: 1464\n",
" stream_order_output: 1\n",
" cdm_datatype: Station\n",
" Conventions: CF-1.6\n",
" code_version: v5.1.0-alpha11\n",
" model_output_type: channel_rt\n",
" model_configuration: retrospective\n",
" dev_OVRTSWCRT: 1\n",
" dev_NOAH_TIMESTEP: 3600\n",
" dev_channel_only: 0\n",
" dev_channelBucket_only: 0\n",
" dev: dev_ prefix indicates development/internal me..."
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dset"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A nice chunk size for object storage is on the order of 100Mb. "
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"time_chunk_size = 672 \n",
"feature_chunk_size = 30000"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"121.0"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"81312/672"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"90.96923333333334"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nh_chunks = len(dset.feature_id)/feature_chunk_size\n",
"nh_chunks"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"340"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nt_chunks = int(np.ceil(len(files)/time_chunk_size))\n",
"nt_chunks"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"161.28"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(time_chunk_size * feature_chunk_size )*8 / 1e6"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"... Close enough to 100Mb"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a function to drop stuff that messes up `open_mfdataset`"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"def drop_coords(ds):\n",
" ds = ds.drop(['reference_time','feature_id', 'crs'])\n",
" return ds.reset_coords(drop=True)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"#cluster.close(); client.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a local dask cluster"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b98aabe52ffd41eca9786a151266d5ec",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(HTML(value='<h2>LocalCluster</h2>'), HBox(children=(HTML(value='\\n<div>\\n <style scoped>\\n …"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#cluster = LocalCluster() # for this first step, having 32 workers is faster\n",
"cluster = LocalCluster(n_workers=8, threads_per_worker=1) \n",
"cluster"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"client = Client(cluster)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Tell blosc not to use threads since we are using dask to parallelize"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"numcodecs.blosc.use_threads = False"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"zarr_step = 'zarr/step'\n",
"zarr_chunked = 'zarr/nwm'\n",
"\n",
"zarr_temp = 'zarr/tmp'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Step our way through the dataset, reading one chunk along the time dimension at a time, to avoid dask reading too many chunks before writing and blowing out memory. First time chunk is written to zarr, then others are appended. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Set up Rechunker"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"from rechunker import rechunk"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"13.50GB\n"
]
}
],
"source": [
"chunk_mem_factor = 0.8 #fraction of worker memory for each chunk (seems to be the max possible)\n",
"worker_mem = cluster.worker_spec[0]['options']['memory_limit']/1e9\n",
"max_mem = '{:.2f}GB'.format(chunk_mem_factor * worker_mem)\n",
"print(max_mem)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Do the big loop"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"319\n",
"320\n",
"321\n",
"322\n",
"323\n",
"324\n",
"325\n",
"326\n",
"327\n",
"328\n",
"329\n",
"330\n",
"331\n",
"332\n",
"333\n",
"334\n",
"335\n",
"336\n",
"337\n",
"338\n",
"339\n"
]
},
{
"ename": "ValueError",
"evalue": "Invalid chunk_limits (96, 2729077).",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<timed exec>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n",
"\u001b[0;32m~/miniconda3/envs/pangeo/lib/python3.7/site-packages/rechunker/api.py\u001b[0m in \u001b[0;36mrechunk\u001b[0;34m(source, target_chunks, max_mem, target_store, target_options, temp_store, temp_options, executor)\u001b[0m\n\u001b[1;32m 301\u001b[0m \u001b[0mtarget_options\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtarget_options\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 302\u001b[0m \u001b[0mtemp_store\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtemp_store\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 303\u001b[0;31m \u001b[0mtemp_options\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtemp_options\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 304\u001b[0m )\n\u001b[1;32m 305\u001b[0m \u001b[0mplan\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mexecutor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprepare_plan\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcopy_spec\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/miniconda3/envs/pangeo/lib/python3.7/site-packages/rechunker/api.py\u001b[0m in \u001b[0;36m_setup_rechunk\u001b[0;34m(source, target_chunks, max_mem, target_store, target_options, temp_store, temp_options)\u001b[0m\n\u001b[1;32m 381\u001b[0m \u001b[0mtemp_store_or_group\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtemp_group\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 382\u001b[0m \u001b[0mtemp_options\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 383\u001b[0;31m \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 384\u001b[0m )\n\u001b[1;32m 385\u001b[0m \u001b[0mcopy_spec\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrite\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mattrs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvariable_attrs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# type: ignore\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/miniconda3/envs/pangeo/lib/python3.7/site-packages/rechunker/api.py\u001b[0m in \u001b[0;36m_setup_array_rechunk\u001b[0;34m(source_array, target_chunks, max_mem, target_store_or_group, target_options, temp_store_or_group, temp_options, name)\u001b[0m\n\u001b[1;32m 484\u001b[0m \u001b[0mitemsize\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 485\u001b[0m \u001b[0mmax_mem\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 486\u001b[0;31m \u001b[0mconsolidate_reads\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mconsolidate_reads\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 487\u001b[0m )\n\u001b[1;32m 488\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/miniconda3/envs/pangeo/lib/python3.7/site-packages/rechunker/algorithm.py\u001b[0m in \u001b[0;36mrechunking_plan\u001b[0;34m(shape, source_chunks, target_chunks, itemsize, max_mem, consolidate_reads, consolidate_writes)\u001b[0m\n\u001b[1;32m 127\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 128\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mconsolidate_writes\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 129\u001b[0;31m \u001b[0mwrite_chunks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mconsolidate_chunks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtarget_chunks\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mitemsize\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_mem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 130\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 131\u001b[0m \u001b[0mwrite_chunks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtarget_chunks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/miniconda3/envs/pangeo/lib/python3.7/site-packages/rechunker/algorithm.py\u001b[0m in \u001b[0;36mconsolidate_chunks\u001b[0;34m(shape, chunks, itemsize, max_mem, chunk_limits)\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0mchunk_limit_per_axis\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mn_ax\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mn_ax\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 52\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 53\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Invalid chunk_limits {chunk_limits}.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 54\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[0mchunk_mem\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mitemsize\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mprod\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchunks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mValueError\u001b[0m: Invalid chunk_limits (96, 2729077)."
]
}
],
"source": [
"%%time\n",
"for i in range(nt_chunks):\n",
" print(i)\n",
" istart = i * time_chunk_size\n",
" istop = int(np.min([(i+1) * time_chunk_size, len(files)]))\n",
" \n",
" ds = xr.open_mfdataset(files[istart:istop], parallel=True, \n",
" preprocess=drop_coords, combine='by_coords', \n",
" concat_dim='time', join='override')\n",
" \n",
" # add back in the 'feature_id' coordinate removed by preprocessing \n",
" ds.coords['feature_id'] = dset.coords['feature_id']\n",
" \n",
" # chunk this step to zarr using rechunker\n",
"\n",
" # remote the temp and step zarr datasets\n",
" try:\n",
" shutil.rmtree(zarr_temp)\n",
" while os.path.exists(zarr_temp): # check if it still exists\n",
" pass\n",
" except:\n",
" pass\n",
"\n",
" try:\n",
" shutil.rmtree(zarr_step)\n",
" while os.path.exists(zarr_step): # check if it still exists\n",
" pass\n",
" except:\n",
" pass\n",
" \n",
" chunk_plan={}\n",
" for var in ds.data_vars:\n",
" if len(ds[var].dims)==2:\n",
" var_chunk = (time_chunk_size, feature_chunk_size)\n",
" chunk_plan[var] = var_chunk\n",
"\n",
" array_plan = rechunk(ds, chunk_plan, max_mem, zarr_step, \n",
" temp_store=zarr_temp)\n",
" \n",
" with performance_report(filename=\"dask-report.html\"):\n",
" result = array_plan.execute(retries=10)\n",
"\n",
" # read back in the zarr chunk rechunker wrote\n",
" ds = xr.open_zarr(zarr_step)\n",
"\n",
" if i==0:\n",
" ds.to_zarr(zarr_chunked, consolidated=True, mode='w')\n",
" else:\n",
" ds.to_zarr(zarr_chunked, consolidated=True, append_dim='time')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The workflow threw an error on the last partial chunk because Rechunker doesn't think the chunk_plan is valid. But it is valid to have a partial last chunk. Here we just rechunk the last partial chunk without rechunker and append it to the overall Zarr dataset. "
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"ds1 = ds.chunk({'feature_id':feature_chunk_size, 'time':time_chunk_size})"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<xarray.backends.zarr.ZarrStore at 0x7f53d6518530>"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ds1.to_zarr('./zarr/last_step', consolidated=True, mode='w')"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"ds2 = xr.open_zarr('/usgs/gamone/data2/rsignell/data/NWM2/zarr/last_step', consolidated=True)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<xarray.backends.zarr.ZarrStore at 0x7f544c8b4410>"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ds2.to_zarr(zarr_chunked, consolidated=True, append_dim='time')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Check the resulting chunked dataset for correct start time, stop time and for any gaps. If there are no gaps we should get just a single unique value of 3600s for the difference between the hourly time steps. "
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1993-01-01T00:00:00.000000000\n",
"2018-12-31T23:00:00.000000000\n"
]
}
],
"source": [
"ds1 = xr.open_zarr('/usgs/gamone/data2/rsignell/data/NWM2/zarr/nwm', consolidated=True)\n",
"print(ds1.time[0].values)\n",
"print(ds1.time[-1].values)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"d1 = ds1.time.diff(dim='time').values/1e9 # convert datetime64 nanoseconds to seconds"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([3600], dtype='timedelta64[ns]')"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.unique(d1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#cluster.close(); client.close()"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Matplotlib is building the font cache; this may take a moment.\n"
]
},
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f53f34c1110>]"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import hvplot.xarray\n",
"ds1.streamflow[:,1000].plot()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.8"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"state": {
"09f60392b4f441f392f7aa3fa8d685ca": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"0bd9e97ffe06417ca2f9ecbd58b8c7ce": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"0bde0522f4944f9497cc25fd281f4f34": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"0cbfede68ed74f2ebec869ddaac41bd2": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HBoxModel",
"state": {
"children": [
"IPY_MODEL_166f3bbbf8f24df89172b53a48fa5816",
"IPY_MODEL_35b998ec9ddf432ea878503e4cb57009",
"IPY_MODEL_bd9e1db6ebae464d81372683366da6f4"
],
"layout": "IPY_MODEL_7fa59a02422f404ca36d887d3d34f527"
}
},
"10444f48e4fb406d8e74d70cc61992db": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"min_width": "150px"
}
},
"116b525d7c1a45dea10afdf32575fc2a": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_5c270e206e2e475eb0fc2b54aa8185b8",
"style": "IPY_MODEL_fad38e1d0d474d4e9a3d3ee879f20572",
"value": "<h2>LocalCluster</h2>"
}
},
"14edd9679e994692848cf3fa73e4e0c2": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"width": "150px"
}
},
"166f3bbbf8f24df89172b53a48fa5816": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "IntTextModel",
"state": {
"description": "Minimum",
"layout": "IPY_MODEL_4e98f0fa3b474197b3fe7a3578f84694",
"step": 1,
"style": "IPY_MODEL_5d47dac17314417ea9650f660884a5de"
}
},
"18aaea04573e46f48af8e85af387e6f3": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_7ca4114c01f749b6a0bcbb04f36e8816",
"style": "IPY_MODEL_96b4210ee9c74accb8859fd04b1a2bc8",
"value": "<h2>LocalCluster</h2>"
}
},
"1a514a329bed4cb6815fce201ec81a25": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"1b70ea94a58348e281d3c8f59aa11e21": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "ButtonModel",
"state": {
"description": "Adapt",
"layout": "IPY_MODEL_7ada416dd4654703a9de7d85695b5046",
"style": "IPY_MODEL_9a71a8911eb34a2ca4ef363006191dd2"
}
},
"1d2a9582bbbe4b9fb7708e804500aa88": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HBoxModel",
"state": {
"children": [
"IPY_MODEL_939a097c3dfd48c1995b927e17535930",
"IPY_MODEL_4aa6653eaed845679ba2e1e841e0cc76",
"IPY_MODEL_1b70ea94a58348e281d3c8f59aa11e21"
],
"layout": "IPY_MODEL_a45f633ac50b4805852214e4b26f0c70"
}
},
"2807c7610de342a48b1f9764cc10bac3": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_3fece436655c4e8b884947da0d1077c8",
"style": "IPY_MODEL_f73a46a0ab0b43dea33108da0a005707",
"value": "\n<div>\n <style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n </style>\n <table style=\"text-align: right;\">\n <tr> <th>Workers</th> <td>8</td></tr>\n <tr> <th>Cores</th> <td>8</td></tr>\n <tr> <th>Memory</th> <td>540.91 GB</td></tr>\n </table>\n</div>\n"
}
},
"2c51f71ae92f41ffb08f5e1fa42b7942": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "IntTextModel",
"state": {
"description": "Maximum",
"layout": "IPY_MODEL_14edd9679e994692848cf3fa73e4e0c2",
"step": 1,
"style": "IPY_MODEL_341582d6265c4722961af219b4b73c0d"
}
},
"341582d6265c4722961af219b4b73c0d": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"34781e3f3e374d1bae0bf8515c788526": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"35515d765a8d4512a0b21c0523c96a9b": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"35b998ec9ddf432ea878503e4cb57009": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "IntTextModel",
"state": {
"description": "Maximum",
"layout": "IPY_MODEL_4e98f0fa3b474197b3fe7a3578f84694",
"step": 1,
"style": "IPY_MODEL_45012b509e82447a882168c89cc3294a"
}
},
"384da4a05e45440db06de4e61c267994": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"399a1411fbfe47fe82f6bf804b434c09": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "ButtonModel",
"state": {
"description": "Scale",
"layout": "IPY_MODEL_14edd9679e994692848cf3fa73e4e0c2",
"style": "IPY_MODEL_ef4283a199be4280a7473f78921ebb7a"
}
},
"3a4a70223ad04577afe21c0a2caeb8f5": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_a580d96051814c57bde0f41678f00504",
"style": "IPY_MODEL_0bde0522f4944f9497cc25fd281f4f34",
"value": "<p><b>Dashboard: </b><a href=\"http://127.0.0.1:8787/status\" target=\"_blank\">http://127.0.0.1:8787/status</a></p>\n"
}
},
"3b193b9eb576419fa6d90ad278476d44": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"3b59684f3fec4aa2ae0067c92b30f114": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"3fabe6bdaa1f4c1d86f5a775271c3e5a": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"3fece436655c4e8b884947da0d1077c8": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"min_width": "150px"
}
},
"41d8470e436544949947590cf2d81b0b": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"4326bbd2e1f04b96ba1651f0457d7ab6": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"45012b509e82447a882168c89cc3294a": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"46632b2539ad4841ac37a98cb241ce90": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "ButtonStyleModel",
"state": {}
},
"4a16b2b89dd74c449df5db89fb352b59": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"4aa6653eaed845679ba2e1e841e0cc76": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "IntTextModel",
"state": {
"description": "Maximum",
"layout": "IPY_MODEL_7ada416dd4654703a9de7d85695b5046",
"step": 1,
"style": "IPY_MODEL_e9def914fe924407bab482718bf010b1"
}
},
"4e554b6f74464e34b9e4d90e8594d0e3": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "IntTextModel",
"state": {
"description": "Workers",
"layout": "IPY_MODEL_7ada416dd4654703a9de7d85695b5046",
"step": 1,
"style": "IPY_MODEL_3fabe6bdaa1f4c1d86f5a775271c3e5a"
}
},
"4e98f0fa3b474197b3fe7a3578f84694": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"width": "150px"
}
},
"513369a2a1fc4edc9622cebfd45bdbf2": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"51b64c28ab574dc99c19181bb345a935": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "AccordionModel",
"state": {
"_titles": {
"0": "Manual Scaling",
"1": "Adaptive Scaling"
},
"children": [
"IPY_MODEL_6a8cdb8f59ec45b384902120d2a09f0a",
"IPY_MODEL_83585005cc2e4b27a170fc53685e103a"
],
"layout": "IPY_MODEL_c7c22c4e2c344b81a6a2e35b0b1bb94d",
"selected_index": null
}
},
"561afce9032e409bb5b3b032225d5541": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "ButtonModel",
"state": {
"description": "Scale",
"layout": "IPY_MODEL_4e98f0fa3b474197b3fe7a3578f84694",
"style": "IPY_MODEL_e1fc1a716fb94daebdb5cf168522ffce"
}
},
"56965f7145e043a2bbb2166cb9862555": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"5bd0da2940754727a532aefab927e1a4": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "ButtonStyleModel",
"state": {}
},
"5c270e206e2e475eb0fc2b54aa8185b8": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"5d47dac17314417ea9650f660884a5de": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"68c8449613ae4f2e885702d870fb8ec8": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"6a8cdb8f59ec45b384902120d2a09f0a": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HBoxModel",
"state": {
"children": [
"IPY_MODEL_ac287d6940104586860c1c76f58531e4",
"IPY_MODEL_399a1411fbfe47fe82f6bf804b434c09"
],
"layout": "IPY_MODEL_41d8470e436544949947590cf2d81b0b"
}
},
"6a9542952e694341b1c3c31735295f76": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_10444f48e4fb406d8e74d70cc61992db",
"style": "IPY_MODEL_97d85cf4e0da42859bcca341c35ee548",
"value": "\n<div>\n <style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n </style>\n <table style=\"text-align: right;\">\n <tr> <th>Workers</th> <td>8</td></tr>\n <tr> <th>Cores</th> <td>40</td></tr>\n <tr> <th>Memory</th> <td>540.91 GB</td></tr>\n </table>\n</div>\n"
}
},
"6adf9acec6544b7c8320442ed5ea7d4d": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"6b3bb80a29044d7a98771511718cb797": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_b790110b58254695af23818ec6d06f47",
"style": "IPY_MODEL_9091aaee251349eba0672cc81c3d8056",
"value": "\n<div>\n <style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n </style>\n <table style=\"text-align: right;\">\n <tr> <th>Workers</th> <td>8</td></tr>\n <tr> <th>Cores</th> <td>40</td></tr>\n <tr> <th>Memory</th> <td>540.91 GB</td></tr>\n </table>\n</div>\n"
}
},
"6bbe1fbd905741fa8c0d7a2d0742f519": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"6fa3dd431b92447989bc63e59c1253e5": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"79c74a13946a43c3a7d55300bf085866": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "VBoxModel",
"state": {
"children": [
"IPY_MODEL_116b525d7c1a45dea10afdf32575fc2a",
"IPY_MODEL_ec90aea084414c71a8338c5c2d68e307",
"IPY_MODEL_ce9aaee26ddd48ab9f44bf616774d7fd"
],
"layout": "IPY_MODEL_3b59684f3fec4aa2ae0067c92b30f114"
}
},
"7ada416dd4654703a9de7d85695b5046": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"width": "150px"
}
},
"7ca4114c01f749b6a0bcbb04f36e8816": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"7f42b0885b844ceda8a213c4ab634df7": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "ButtonModel",
"state": {
"description": "Adapt",
"layout": "IPY_MODEL_14edd9679e994692848cf3fa73e4e0c2",
"style": "IPY_MODEL_46632b2539ad4841ac37a98cb241ce90"
}
},
"7fa59a02422f404ca36d887d3d34f527": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"83585005cc2e4b27a170fc53685e103a": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HBoxModel",
"state": {
"children": [
"IPY_MODEL_dfe452c763cf4ea4bb95bb1ab560ed2c",
"IPY_MODEL_2c51f71ae92f41ffb08f5e1fa42b7942",
"IPY_MODEL_7f42b0885b844ceda8a213c4ab634df7"
],
"layout": "IPY_MODEL_513369a2a1fc4edc9622cebfd45bdbf2"
}
},
"85f9adb9e20c4abea53873cbba30755c": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_4a16b2b89dd74c449df5db89fb352b59",
"style": "IPY_MODEL_4326bbd2e1f04b96ba1651f0457d7ab6",
"value": "<h2>LocalCluster</h2>"
}
},
"867cfdb1bcd2476987cb789f6c92f550": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HBoxModel",
"state": {
"children": [
"IPY_MODEL_4e554b6f74464e34b9e4d90e8594d0e3",
"IPY_MODEL_e0330ca1a7c9475fad76b5912a8b9d3b"
],
"layout": "IPY_MODEL_68c8449613ae4f2e885702d870fb8ec8"
}
},
"8857abc3b0a44f7aab2e8295cfad8d1b": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "AccordionModel",
"state": {
"_titles": {
"0": "Manual Scaling",
"1": "Adaptive Scaling"
},
"children": [
"IPY_MODEL_91c9b6f075284222ac23934df67d5563",
"IPY_MODEL_0cbfede68ed74f2ebec869ddaac41bd2"
],
"layout": "IPY_MODEL_f9a36bc7fb1342578d03cd9acb56e119",
"selected_index": null
}
},
"9091aaee251349eba0672cc81c3d8056": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"91c9b6f075284222ac23934df67d5563": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HBoxModel",
"state": {
"children": [
"IPY_MODEL_fb72fa920a65490c98934909cfaa56a8",
"IPY_MODEL_561afce9032e409bb5b3b032225d5541"
],
"layout": "IPY_MODEL_6adf9acec6544b7c8320442ed5ea7d4d"
}
},
"939a097c3dfd48c1995b927e17535930": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "IntTextModel",
"state": {
"description": "Minimum",
"layout": "IPY_MODEL_7ada416dd4654703a9de7d85695b5046",
"step": 1,
"style": "IPY_MODEL_dc0543b7b997483fb7f6142be03800a0"
}
},
"96b4210ee9c74accb8859fd04b1a2bc8": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"97d85cf4e0da42859bcca341c35ee548": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"9a71a8911eb34a2ca4ef363006191dd2": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "ButtonStyleModel",
"state": {}
},
"a45f633ac50b4805852214e4b26f0c70": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"a580d96051814c57bde0f41678f00504": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {}
},
"a8db9564850144d2aeeba623174f5ae2": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "ButtonStyleModel",
"state": {}
},
"ac287d6940104586860c1c76f58531e4": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "IntTextModel",
"state": {
"description": "Workers",
"layout": "IPY_MODEL_14edd9679e994692848cf3fa73e4e0c2",
"step": 1,
"style": "IPY_MODEL_e62ceffe4a9b40d196329b63c7cb1560"
}
},
"b0b6a9fdb5d74c41811b9c87a1889e7d": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "VBoxModel",
"state": {
"children": [
"IPY_MODEL_85f9adb9e20c4abea53873cbba30755c",
"IPY_MODEL_deac1bb711064eff846235fc15b63852",
"IPY_MODEL_3a4a70223ad04577afe21c0a2caeb8f5"
],
"layout": "IPY_MODEL_35515d765a8d4512a0b21c0523c96a9b"
}
},
"b74ee393e2564af9bd280cb095d1e590": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"min_width": "500px"
}
},
"b790110b58254695af23818ec6d06f47": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"min_width": "150px"
}
},
"bd9e1db6ebae464d81372683366da6f4": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "ButtonModel",
"state": {
"description": "Adapt",
"layout": "IPY_MODEL_4e98f0fa3b474197b3fe7a3578f84694",
"style": "IPY_MODEL_5bd0da2940754727a532aefab927e1a4"
}
},
"c7c22c4e2c344b81a6a2e35b0b1bb94d": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"min_width": "500px"
}
},
"cae579065b134bfb89083f984a0e8de5": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"cd0958c1e2a049269e5a8fb9337ea95e": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "AccordionModel",
"state": {
"_titles": {
"0": "Manual Scaling",
"1": "Adaptive Scaling"
},
"children": [
"IPY_MODEL_867cfdb1bcd2476987cb789f6c92f550",
"IPY_MODEL_1d2a9582bbbe4b9fb7708e804500aa88"
],
"layout": "IPY_MODEL_b74ee393e2564af9bd280cb095d1e590",
"selected_index": null
}
},
"ce9aaee26ddd48ab9f44bf616774d7fd": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_09f60392b4f441f392f7aa3fa8d685ca",
"style": "IPY_MODEL_6fa3dd431b92447989bc63e59c1253e5",
"value": "<p><b>Dashboard: </b><a href=\"http://127.0.0.1:8787/status\" target=\"_blank\">http://127.0.0.1:8787/status</a></p>\n"
}
},
"d2a69396a4a44cb7be4f30a0afeeaa2d": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_6bbe1fbd905741fa8c0d7a2d0742f519",
"style": "IPY_MODEL_34781e3f3e374d1bae0bf8515c788526",
"value": "<p><b>Dashboard: </b><a href=\"http://127.0.0.1:8787/status\" target=\"_blank\">http://127.0.0.1:8787/status</a></p>\n"
}
},
"d48d41d4e6b9440bb9f19db20a06b31b": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "VBoxModel",
"state": {
"children": [
"IPY_MODEL_18aaea04573e46f48af8e85af387e6f3",
"IPY_MODEL_d97648f5761e4602a3bf16be017947f2",
"IPY_MODEL_d2a69396a4a44cb7be4f30a0afeeaa2d"
],
"layout": "IPY_MODEL_56965f7145e043a2bbb2166cb9862555"
}
},
"d97648f5761e4602a3bf16be017947f2": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HBoxModel",
"state": {
"children": [
"IPY_MODEL_6b3bb80a29044d7a98771511718cb797",
"IPY_MODEL_8857abc3b0a44f7aab2e8295cfad8d1b"
],
"layout": "IPY_MODEL_0bd9e97ffe06417ca2f9ecbd58b8c7ce"
}
},
"dc0543b7b997483fb7f6142be03800a0": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"deac1bb711064eff846235fc15b63852": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HBoxModel",
"state": {
"children": [
"IPY_MODEL_6a9542952e694341b1c3c31735295f76",
"IPY_MODEL_cd0958c1e2a049269e5a8fb9337ea95e"
],
"layout": "IPY_MODEL_384da4a05e45440db06de4e61c267994"
}
},
"dfe452c763cf4ea4bb95bb1ab560ed2c": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "IntTextModel",
"state": {
"description": "Minimum",
"layout": "IPY_MODEL_14edd9679e994692848cf3fa73e4e0c2",
"step": 1,
"style": "IPY_MODEL_cae579065b134bfb89083f984a0e8de5"
}
},
"e0330ca1a7c9475fad76b5912a8b9d3b": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "ButtonModel",
"state": {
"description": "Scale",
"layout": "IPY_MODEL_7ada416dd4654703a9de7d85695b5046",
"style": "IPY_MODEL_a8db9564850144d2aeeba623174f5ae2"
}
},
"e1fc1a716fb94daebdb5cf168522ffce": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "ButtonStyleModel",
"state": {}
},
"e62ceffe4a9b40d196329b63c7cb1560": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"e9def914fe924407bab482718bf010b1": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"ec90aea084414c71a8338c5c2d68e307": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HBoxModel",
"state": {
"children": [
"IPY_MODEL_2807c7610de342a48b1f9764cc10bac3",
"IPY_MODEL_51b64c28ab574dc99c19181bb345a935"
],
"layout": "IPY_MODEL_3b193b9eb576419fa6d90ad278476d44"
}
},
"ef4283a199be4280a7473f78921ebb7a": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "ButtonStyleModel",
"state": {}
},
"f73a46a0ab0b43dea33108da0a005707": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"f9a36bc7fb1342578d03cd9acb56e119": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"min_width": "500px"
}
},
"fad38e1d0d474d4e9a3d3ee879f20572": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"fb72fa920a65490c98934909cfaa56a8": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "IntTextModel",
"state": {
"description": "Workers",
"layout": "IPY_MODEL_4e98f0fa3b474197b3fe7a3578f84694",
"step": 1,
"style": "IPY_MODEL_1a514a329bed4cb6815fce201ec81a25"
}
}
},
"version_major": 2,
"version_minor": 0
}
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment