Skip to content

Instantly share code, notes, and snippets.

@crusaderky
Created March 3, 2023 16:36
Show Gist options
  • Save crusaderky/a97f870c51260e63a1c14c20b762f666 to your computer and use it in GitHub Desktop.
Save crusaderky/a97f870c51260e63a1c14c20b762f666 to your computer and use it in GitHub Desktop.
Fine performance metrics demo (distributed#7586)
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "0652f264-b2c3-43b2-9310-7c00e50e7cdc",
"metadata": {},
"source": [
"# Feature Engineering In Advance of HPO\n",
"\n",
"Demo notebook for https://github.com/dask/distributed/pull/7586, showcasing task I/O and spilling.\n",
"The workflow being executed is a copy-paste of https://github.com/coiled/dask-xgboost-nyctaxi/blob/main/Feature%20Engineering.ipynb\n",
"\n",
"The only difference is that all calls to `optimize()` have been replaced with `(optimize_graph=False)` in order to have clearer task prefixes in the metrics.\n",
"\n",
"In order to meter parquet I/O, you need to apply a 3-lines patch to dask/dask:"
]
},
{
"cell_type": "raw",
"id": "e0f617bd",
"metadata": {},
"source": [
"--- a/dask/dataframe/io/parquet/core.py\n",
"+++ b/dask/dataframe/io/parquet/core.py\n",
"@@ -27,6 +27,8 @@ from dask.highlevelgraph import HighLevelGraph\n",
" from dask.layers import DataFrameIOLayer\n",
" from dask.utils import apply, import_required, natural_sort_key, parse_bytes\n",
" \n",
"+from distributed.metrics import context_meter\n",
"+\n",
" __all__ = (\"read_parquet\", \"to_parquet\")\n",
" \n",
" NONE_LABEL = \"__null_dask_index__\"\n",
"@@ -158,6 +160,7 @@ class ToParquetFunctionWrapper:\n",
" self.kwargs_pass,\n",
" )\n",
" \n",
"+ @context_meter.meter(\"I/O\")\n",
" def __call__(self, df, block_index: tuple[int]):\n",
" # Get partition index from block index tuple\n",
" part_i = block_index[0]\n",
"@@ -643,6 +646,7 @@ def check_multi_support(engine):\n",
" return hasattr(engine, \"multi_support\") and engine.multi_support()\n",
" \n",
" \n",
"+@context_meter.meter(\"I/O\")\n",
" def read_parquet_part(\n",
" fs, engine, meta, part, columns, index, use_nullable_dtypes, kwargs\n",
" ):"
]
},
{
"cell_type": "markdown",
"id": "b6ff1c43",
"metadata": {},
"source": [
"### Start Coiled cluster"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "3b929987-5089-4c13-be35-c1812d65fbec",
"metadata": {},
"outputs": [],
"source": [
"import coiled\n",
"import dask.config\n",
"import dask.dataframe as dd\n",
"import distributed\n",
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "3abab0dd-e0ed-4763-b740-5bc4cf0ecb0f",
"metadata": {
"scrolled": false,
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Processing /home/crusaderky/github/dask\n",
" Installing build dependencies: started\n",
" Installing build dependencies: finished with status 'done'\n",
" Getting requirements to build wheel: started\n",
" Getting requirements to build wheel: finished with status 'done'\n",
" Preparing metadata (pyproject.toml): started\n",
" Preparing metadata (pyproject.toml): finished with status 'done'\n",
"Building wheels for collected packages: dask\n",
" Building wheel for dask (pyproject.toml): started\n",
" Building wheel for dask (pyproject.toml): finished with status 'done'\n",
" Created wheel for dask: filename=dask-2023.3.0+4.g3e05886ec-py3-none-any.whl size=1162552 sha256=60b74404076badeaab0d72c6d0d1d493b01e2cb434e094e9244f97ab2b8117f8\n",
" Stored in directory: /tmp/pip-ephem-wheel-cache-eb_uhmce/wheels/eb/1a/fb/1189c654380fe182ec1b147cbdd21a7a0bb67bd5c8a8a6d2b8\n",
"Successfully built dask\n",
"Processing /home/crusaderky/github/distributed\n",
" Installing build dependencies: started\n",
" Installing build dependencies: finished with status 'done'\n",
" Getting requirements to build wheel: started\n",
" Getting requirements to build wheel: finished with status 'done'\n",
" Preparing metadata (pyproject.toml): started\n",
" Preparing metadata (pyproject.toml): finished with status 'done'\n",
"Building wheels for collected packages: distributed\n",
" Building wheel for distributed (pyproject.toml): started\n",
" Building wheel for distributed (pyproject.toml): finished with status 'done'\n",
" Created wheel for distributed: filename=distributed-2023.3.0+40.g0b73bfa2f-py3-none-any.whl size=1295944 sha256=33bc36aa62810c68cae191564cf483bf870532b985b28a3c84216f2d0e86e98e\n",
" Stored in directory: /tmp/pip-ephem-wheel-cache-e5sk3vs6/wheels/60/25/b9/915660abc977d0d56038cb407d33358095856354b234ca3039\n",
"Successfully built distributed\n"
]
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">╭─────────────────────────────────────── <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Package Sync Notes</span> ───────────────────────────────────────╮\n",
"│ ╷ │\n",
"│ <span style=\"font-weight: bold\"> Package </span>│<span style=\"font-weight: bold\"> Note </span> │\n",
"│ ╶──────────────────────┼───────────────────────────────────────────────────────────────────────╴ │\n",
"│ PyQt5-sip │ Package ignored │\n",
"│ coiled-runtime │ Package ignored │\n",
"│ dask │ Wheel built from /home/crusaderky/github/dask │\n",
"│ distributed │ Wheel built from /home/crusaderky/github/distributed │\n",
"│ libabseil │ Package ignored │\n",
"│ openssl │ Package ignored │\n",
"│ pyqt5-sip │ Package ignored │\n",
"│ ╵ │\n",
"╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
"</pre>\n"
],
"text/plain": [
"╭─────────────────────────────────────── \u001b[1;32mPackage Sync Notes\u001b[0m ───────────────────────────────────────╮\n",
"│ ╷ │\n",
"│ \u001b[1m \u001b[0m\u001b[1mPackage \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mNote \u001b[0m\u001b[1m \u001b[0m │\n",
"│ ╶──────────────────────┼───────────────────────────────────────────────────────────────────────╴ │\n",
"│ PyQt5-sip │ Package ignored │\n",
"│ coiled-runtime │ Package ignored │\n",
"│ dask │ Wheel built from /home/crusaderky/github/dask │\n",
"│ distributed │ Wheel built from /home/crusaderky/github/distributed │\n",
"│ libabseil │ Package ignored │\n",
"│ openssl │ Package ignored │\n",
"│ pyqt5-sip │ Package ignored │\n",
"│ ╵ │\n",
"╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
],
"text/plain": [
"\u001b[?25l"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d751b205ddae43e69fb4267542ee89c4",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Output()"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
"</pre>\n"
],
"text/plain": [
"\n",
"\u001b[?25h"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/crusaderky/github/distributed/distributed/client.py:1361: VersionMismatchWarning: Mismatched versions found\n",
"\n",
"+---------+--------+-----------+---------+\n",
"| Package | Client | Scheduler | Workers |\n",
"+---------+--------+-----------+---------+\n",
"| pandas | 1.5.2 | 1.5.3 | 1.5.3 |\n",
"+---------+--------+-----------+---------+\n",
" warnings.warn(version_module.VersionMismatchWarning(msg[0][\"warning\"]))\n"
]
}
],
"source": [
"dask.config.set({\"dataframe.dtype_backend\": \"pyarrow\"})\n",
"\n",
"cluster = coiled.Cluster(\n",
" worker_vm_types=[\"m6i.xlarge\"],\n",
" scheduler_vm_types=[\"m6i.large\"],\n",
" package_sync=True, # align remote packages to local ones\n",
" n_workers=10,\n",
" backend_options={\n",
" \"region\": \"us-east-2\",\n",
" \"multizone\": True,\n",
" \"spot\": True,\n",
" \"spot_on_demand_fallback\": True,\n",
" },\n",
" account=\"dask-engineering\",\n",
")\n",
"client = distributed.Client(cluster)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "23735db0",
"metadata": {},
"outputs": [],
"source": [
"class SetPandasOptions(distributed.WorkerPlugin):\n",
" def setup(self, worker):\n",
" pd.set_option(\"string_storage\", \"pyarrow\")\n",
"\n",
"\n",
"pd.set_option(\"string_storage\", \"pyarrow\") # Set on the client\n",
"_ = client.register_worker_plugin(SetPandasOptions()) # Set on the workers"
]
},
{
"cell_type": "markdown",
"id": "d46702f2",
"metadata": {},
"source": [
"### Sample start time"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "1f98607f",
"metadata": {},
"outputs": [],
"source": [
"import time\n",
"client.restart()\n",
"t0 = time.perf_counter()"
]
},
{
"cell_type": "markdown",
"id": "1dd461c3-e551-420a-a3e1-1ca2515bb613",
"metadata": {},
"source": [
"### Run workflow"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "edbb2133",
"metadata": {},
"outputs": [],
"source": [
"ddf = dd.read_parquet(\n",
" \"s3://coiled-datasets/prefect-dask/nyc-uber-lyft/processed_data.parquet\",\n",
" index=False,\n",
" columns=[\n",
" \"hvfhs_license_num\",\n",
" \"PULocationID\",\n",
" \"DOLocationID\",\n",
" \"trip_miles\",\n",
" \"trip_time\",\n",
" \"tolls\",\n",
" \"congestion_surcharge\",\n",
" \"airport_fee\",\n",
" \"wav_request_flag\",\n",
" \"on_scene_datetime\",\n",
" \"pickup_datetime\",\n",
" ],\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "012ff7aa",
"metadata": {},
"outputs": [],
"source": [
"ddf = ddf.repartition(partition_size=\"100MB\")"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "ddb6ea59",
"metadata": {},
"outputs": [],
"source": [
"ddf = ddf.assign(\n",
" accessible_vehicle=ddf.on_scene_datetime.isnull(),\n",
" pickup_month=ddf.pickup_datetime.dt.month,\n",
" pickup_dow=ddf.pickup_datetime.dt.dayofweek,\n",
" pickup_hour=ddf.pickup_datetime.dt.hour,\n",
")\n",
"ddf = ddf.drop(columns=[\"on_scene_datetime\", \"pickup_datetime\"])\n",
"ddf[\"airport_fee\"] = ddf[\"airport_fee\"].replace(\"None\", 0).astype(float).fillna(0)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "29bd3401",
"metadata": {},
"outputs": [],
"source": [
"ddf = ddf.dropna(how=\"any\")\n",
"lower_bound = 0\n",
"Q3 = ddf[\"trip_time\"].quantile(0.75)\n",
"upper_bound = Q3 + (1.5 * (Q3 - lower_bound))\n",
"ddf = ddf.loc[(ddf[\"trip_time\"] >= lower_bound) & (ddf[\"trip_time\"] <= upper_bound)]"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "30bd3bf0-f8c2-4240-b12b-8ee6e4c772c0",
"metadata": {},
"outputs": [],
"source": [
"taxi_zone_lookup = pd.read_csv(\n",
" \"s3://coiled-datasets/prefect-dask/nyc-uber-lyft/taxi+_zone_lookup.csv\",\n",
" usecols=[\"LocationID\", \"Borough\"],\n",
")\n",
"BOROUGH_MAPPING = {\n",
" \"Manhattan\": \"Superborough 1\",\n",
" \"Bronx\": \"Superborough 1\",\n",
" \"EWR\": \"Superborough 1\",\n",
" \"Brooklyn\": \"Superborough 2\",\n",
" \"Queens\": \"Superborough 2\",\n",
" \"Staten Island\": \"Superborough 3\",\n",
" \"Unknown\": \"Unknown\",\n",
"}\n",
"\n",
"taxi_zone_lookup[\"Superborough\"] = [\n",
" BOROUGH_MAPPING[k] for k in taxi_zone_lookup[\"Borough\"]\n",
"]\n",
"taxi_zone_lookup = taxi_zone_lookup.astype(\n",
" {\"Borough\": \"string[pyarrow]\", \"Superborough\": \"string[pyarrow]\"}\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "36ea15a2",
"metadata": {},
"outputs": [],
"source": [
"ddf = dd.merge(\n",
" ddf,\n",
" taxi_zone_lookup,\n",
" left_on=\"PULocationID\",\n",
" right_on=\"LocationID\",\n",
" how=\"inner\",\n",
")\n",
"ddf = ddf.rename(columns={\"Borough\": \"PUBorough\", \"Superborough\": \"PUSuperborough\"})\n",
"ddf = ddf.drop(columns=\"LocationID\")\n",
"\n",
"ddf = dd.merge(\n",
" ddf,\n",
" taxi_zone_lookup,\n",
" left_on=\"DOLocationID\",\n",
" right_on=\"LocationID\",\n",
" how=\"inner\",\n",
")\n",
"ddf = ddf.rename(columns={\"Borough\": \"DOBorough\", \"Superborough\": \"DOSuperborough\"})\n",
"ddf = ddf.drop(columns=\"LocationID\")\n",
"\n",
"ddf[\"PUSuperborough_DOSuperborough\"] = ddf.PUSuperborough.str.cat(\n",
" ddf.DOSuperborough, sep=\"-\"\n",
")\n",
"ddf = ddf.drop(columns=[\"PUSuperborough\", \"DOSuperborough\"])"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "04b66acb",
"metadata": {},
"outputs": [],
"source": [
"categories = [\n",
" \"hvfhs_license_num\",\n",
" \"PULocationID\",\n",
" \"DOLocationID\",\n",
" \"wav_request_flag\",\n",
" \"accessible_vehicle\",\n",
" \"pickup_month\",\n",
" \"pickup_dow\",\n",
" \"pickup_hour\",\n",
" \"PUBorough\",\n",
" \"DOBorough\",\n",
" \"PUSuperborough_DOSuperborough\",\n",
"]\n",
"\n",
"ddf = ddf.astype(dict.fromkeys(categories, \"category\"))\n",
"ddf = ddf.persist(optimize_graph=False)\n",
"ddf = ddf.categorize(categories)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "0334799f",
"metadata": {},
"outputs": [],
"source": [
"ddf = ddf.persist(optimize_graph=False)\n",
"ddf = ddf.repartition(partition_size=\"100MB\")"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "6ae76b35",
"metadata": {},
"outputs": [],
"source": [
"ddf = ddf.astype(\n",
" {\n",
" col: pd.CategoricalDtype(dt.categories.astype(object))\n",
" for col, dt in ddf.dtypes.items()\n",
" if isinstance(dt, pd.CategoricalDtype)\n",
" and dt.categories.dtype == \"string[pyarrow]\"\n",
" }\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "4d929b09",
"metadata": {},
"outputs": [],
"source": [
"# ddf.to_parquet(\n",
"# \"s3://guido-scratch/feature_table.parquet\",\n",
"# overwrite=True,\n",
"# )\n",
"_ = distributed.wait(ddf.map_partitions(lambda x: None))"
]
},
{
"cell_type": "markdown",
"id": "668b6cf5",
"metadata": {},
"source": [
"### Sample start of computation from the client and retrieve the metrics"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "092121aa",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"366.0367508749987"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"t1 = time.perf_counter()\n",
"metrics = client.run(lambda dask_worker: dask_worker.digests_total)\n",
"t1 - t0"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "68922a18-0f7b-465f-a567-4762d0023ec6",
"metadata": {},
"outputs": [],
"source": [
"client.shutdown()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "b7382504",
"metadata": {},
"outputs": [],
"source": [
"import pandas\n",
"pd.options.display.max_rows = None\n",
"\n",
"rows = []\n",
"for addr, digests_total in metrics.items():\n",
" for k, v in digests_total.items():\n",
" if isinstance(k, str):\n",
" continue\n",
" if len(k) == 3:\n",
" rows.append([addr, k[0], \"\", k[1], k[2], v])\n",
" else:\n",
" assert len(k) == 4\n",
" rows.append([addr, *k, v])\n",
"df = pandas.DataFrame(rows, columns=[\"worker\", \"activity\", \"prefix\", \"action\", \"unit\", \"value\"])\n",
"df = df.groupby([\"activity\", \"prefix\", \"action\", \"unit\"]).sum(numeric_only=True)"
]
},
{
"cell_type": "markdown",
"id": "6f406560",
"metadata": {},
"source": [
"### Full metrics, aggregated by worker"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "60255732",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<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 border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th>value</th>\n",
" </tr>\n",
" <tr>\n",
" <th>activity</th>\n",
" <th>prefix</th>\n",
" <th>action</th>\n",
" <th>unit</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"275\" valign=\"top\">execute</th>\n",
" <th rowspan=\"6\" valign=\"top\">add</th>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>1.963000e-05</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>6.400000e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>2.000000e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>5.759396e-04</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>2.852000e-06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>1.502939e-05</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"10\" valign=\"top\">and</th>\n",
" <th>decompress</th>\n",
" <th>seconds</th>\n",
" <td>2.106854e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>8.231467e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-read</th>\n",
" <th>bytes</th>\n",
" <td>3.561756e+09</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>2.760000e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>4.465114e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>1.078697e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1.456000e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>8.946212e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>3.873119e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>1.790220e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"11\" valign=\"top\">assign</th>\n",
" <th>compress</th>\n",
" <th>seconds</th>\n",
" <td>5.037202e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>6.600524e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-write</th>\n",
" <th>bytes</th>\n",
" <td>1.025898e+09</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>5.600000e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>5.690627e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>8.231894e+11</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1.039200e+04</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>1.446904e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>serialize</th>\n",
" <th>seconds</th>\n",
" <td>9.702521e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>8.564522e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>5.076369e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"6\" valign=\"top\">astype</th>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>2.387048e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>2.049516e+11</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1.732000e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>1.104970e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>4.481759e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>6.304594e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"6\" valign=\"top\">categorize_block</th>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>4.063422e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>6.502900e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>8.660000e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>5.076183e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>1.189111e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>5.199587e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"11\" valign=\"top\">drop_by_shallow_copy</th>\n",
" <th>compress</th>\n",
" <th>seconds</th>\n",
" <td>5.581967e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>8.662685e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-write</th>\n",
" <th>bytes</th>\n",
" <td>1.039745e+08</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>5.000000e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>5.186886e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>7.398934e+11</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>3.464000e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>1.789927e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>serialize</th>\n",
" <th>seconds</th>\n",
" <td>1.816554e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>1.469329e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>6.786118e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"11\" valign=\"top\">dropna</th>\n",
" <th>compress</th>\n",
" <th>seconds</th>\n",
" <td>1.379998e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>2.179858e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-write</th>\n",
" <th>bytes</th>\n",
" <td>3.136404e+08</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1.700000e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>1.615429e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>1.164748e+11</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1.732000e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>3.533512e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>serialize</th>\n",
" <th>seconds</th>\n",
" <td>3.112212e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>7.334023e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>6.504962e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"6\" valign=\"top\">dt-dayofweek</th>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>1.171772e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>1.743413e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>8.660000e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>4.081135e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>7.334018e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>2.022717e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"11\" valign=\"top\">dt-hour</th>\n",
" <th>compress</th>\n",
" <th>seconds</th>\n",
" <td>3.543061e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>1.280281e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-write</th>\n",
" <th>bytes</th>\n",
" <td>7.677210e+07</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>4.000000e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>3.805964e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>1.743413e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>8.660000e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>3.615897e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>serialize</th>\n",
" <th>seconds</th>\n",
" <td>7.050185e-03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>6.193667e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>1.932684e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"11\" valign=\"top\">dt-month</th>\n",
" <th>compress</th>\n",
" <th>seconds</th>\n",
" <td>3.132066e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>1.075102e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-write</th>\n",
" <th>bytes</th>\n",
" <td>7.230944e+07</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>3.000000e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>3.577726e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>1.743413e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>8.660000e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>4.042804e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>serialize</th>\n",
" <th>seconds</th>\n",
" <td>1.749212e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>6.166762e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>1.556672e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"11\" valign=\"top\">fillna</th>\n",
" <th>compress</th>\n",
" <th>seconds</th>\n",
" <td>2.103873e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>1.057908e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-write</th>\n",
" <th>bytes</th>\n",
" <td>6.552972e+07</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>2.000000e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>3.389299e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>1.743413e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>8.660000e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>2.228680e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>serialize</th>\n",
" <th>seconds</th>\n",
" <td>7.386675e-03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>9.035824e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>9.276757e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"4\" valign=\"top\">from_pandas</th>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>2.684000e-06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>1.270471e-03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>3.502000e-06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>1.437939e-05</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"11\" valign=\"top\">ge</th>\n",
" <th>compress</th>\n",
" <th>seconds</th>\n",
" <td>8.832241e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>8.445263e-03</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-write</th>\n",
" <th>bytes</th>\n",
" <td>1.819005e+07</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1.000000e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>9.253741e-03</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>1.176653e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>8.660000e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>2.528699e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>serialize</th>\n",
" <th>seconds</th>\n",
" <td>1.567120e-04</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>1.376355e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>1.409568e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"6\" valign=\"top\">get-categories-agg</th>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>1.408131e-03</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>2.398915e+07</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>9.250000e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>1.943847e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>4.902417e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>4.559618e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"6\" valign=\"top\">get-categories-chunk</th>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>2.088719e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>6.502901e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>8.660000e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>4.001039e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>1.461580e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>3.922195e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"11\" valign=\"top\">getitem</th>\n",
" <th>compress</th>\n",
" <th>seconds</th>\n",
" <td>1.663258e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>6.212383e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-write</th>\n",
" <th>bytes</th>\n",
" <td>3.115353e+07</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>3.000000e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>2.198169e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>7.733279e+11</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>5.196000e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>1.008451e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>serialize</th>\n",
" <th>seconds</th>\n",
" <td>4.681260e-04</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>6.541796e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>1.097014e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"6\" valign=\"top\">isnull</th>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>8.831830e-03</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>1.743413e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>8.660000e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>1.839326e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>1.916485e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>1.843588e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"10\" valign=\"top\">le</th>\n",
" <th>decompress</th>\n",
" <th>seconds</th>\n",
" <td>2.328353e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>8.452431e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-read</th>\n",
" <th>bytes</th>\n",
" <td>5.173490e+09</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>2.920000e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>6.826033e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>6.015780e+09</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1.440000e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>7.423455e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>2.143544e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>3.932911e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"15\" valign=\"top\">loc-series</th>\n",
" <th>compress</th>\n",
" <th>seconds</th>\n",
" <td>9.286848e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>decompress</th>\n",
" <th>seconds</th>\n",
" <td>6.460255e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>1.848922e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-read</th>\n",
" <th>bytes</th>\n",
" <td>1.121431e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>2.970000e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>1.038736e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-write</th>\n",
" <th>bytes</th>\n",
" <td>1.866309e+08</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>8.000000e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>1.739051e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>7.417926e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1.435000e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>9.591003e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>serialize</th>\n",
" <th>seconds</th>\n",
" <td>2.044885e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>9.156853e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>1.374590e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"11\" valign=\"top\">merge_chunk</th>\n",
" <th>compress</th>\n",
" <th>seconds</th>\n",
" <td>6.296406e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>4.459591e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-write</th>\n",
" <th>bytes</th>\n",
" <td>1.373803e+08</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>6.000000e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>6.721934e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>2.631508e+11</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>3.464000e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>1.961889e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>serialize</th>\n",
" <th>seconds</th>\n",
" <td>1.260667e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>8.940670e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>1.163169e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"6\" valign=\"top\">mul</th>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>2.368600e-05</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>3.200000e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1.000000e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>4.977354e-04</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>3.760000e-06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>1.793609e-05</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"10\" valign=\"top\">quantiles</th>\n",
" <th>decompress</th>\n",
" <th>seconds</th>\n",
" <td>1.620960e-04</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>3.868425e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-read</th>\n",
" <th>bytes</th>\n",
" <td>1.234200e+04</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>3.300000e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>1.027950e-03</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>1.176662e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1.699000e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>1.844720e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>1.946719e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>7.694072e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"10\" valign=\"top\">read-parquet</th>\n",
" <th>I/O</th>\n",
" <th>seconds</th>\n",
" <td>2.280538e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>compress</th>\n",
" <th>seconds</th>\n",
" <td>1.787037e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>2.358927e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-write</th>\n",
" <th>bytes</th>\n",
" <td>3.919784e+08</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>2.100000e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>2.059484e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>4.874290e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>serialize</th>\n",
" <th>seconds</th>\n",
" <td>4.412802e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>0.000000e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>1.003523e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"11\" valign=\"top\">rename</th>\n",
" <th>compress</th>\n",
" <th>seconds</th>\n",
" <td>1.310685e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>4.025434e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-write</th>\n",
" <th>bytes</th>\n",
" <td>2.735803e+08</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1.200000e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>2.001524e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>3.723729e+11</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1.732000e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>1.429023e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>serialize</th>\n",
" <th>seconds</th>\n",
" <td>2.803826e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>2.028315e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>2.777587e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"11\" valign=\"top\">repartition</th>\n",
" <th>compress</th>\n",
" <th>seconds</th>\n",
" <td>2.022075e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>1.382049e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-write</th>\n",
" <th>bytes</th>\n",
" <td>4.198203e+08</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>2.700000e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>2.140520e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>8.198742e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1.294000e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>2.047477e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>serialize</th>\n",
" <th>seconds</th>\n",
" <td>3.934864e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>6.999167e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>2.744740e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"11\" valign=\"top\">repartition-split</th>\n",
" <th>compress</th>\n",
" <th>seconds</th>\n",
" <td>2.732344e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>8.215349e-03</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-write</th>\n",
" <th>bytes</th>\n",
" <td>5.980626e+08</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>3.400000e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>3.062755e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>4.649859e+11</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1.294000e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>1.319431e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>serialize</th>\n",
" <th>seconds</th>\n",
" <td>7.675315e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>6.208843e-03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>2.789240e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"6\" valign=\"top\">replace</th>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>1.007822e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>1.359723e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>8.660000e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>1.772804e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>4.456288e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>1.729192e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"11\" valign=\"top\">split</th>\n",
" <th>compress</th>\n",
" <th>seconds</th>\n",
" <td>2.689857e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>8.523750e-04</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-write</th>\n",
" <th>bytes</th>\n",
" <td>6.223999e+09</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>3.450000e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>3.094027e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>4.098688e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>4.500000e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>5.599360e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>serialize</th>\n",
" <th>seconds</th>\n",
" <td>6.142642e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>6.445540e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>2.589523e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"6\" valign=\"top\">str_cat</th>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>1.654157e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>7.512703e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1.732000e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>6.471378e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>6.781931e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>9.797700e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"6\" valign=\"top\">sub</th>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>3.815400e-05</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>3.200000e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1.000000e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>1.622431e-03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>5.666000e-06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>2.032163e-05</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"7\" valign=\"top\">total_mem_usage</th>\n",
" <th>I/O</th>\n",
" <th>seconds</th>\n",
" <td>2.919971e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>3.251624e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>6.502950e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>8.660000e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>1.538037e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-cpu</th>\n",
" <th>seconds</th>\n",
" <td>1.386170e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>thread-noncpu</th>\n",
" <th>seconds</th>\n",
" <td>2.262479e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"12\" valign=\"top\">gather-dep</th>\n",
" <th rowspan=\"12\" valign=\"top\"></th>\n",
" <th>busy</th>\n",
" <th>seconds</th>\n",
" <td>1.905684e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>cancelled</th>\n",
" <th>seconds</th>\n",
" <td>2.891501e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>compress</th>\n",
" <th>seconds</th>\n",
" <td>6.130827e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>decompress</th>\n",
" <th>seconds</th>\n",
" <td>1.296874e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>1.180477e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-write</th>\n",
" <th>bytes</th>\n",
" <td>1.237622e+08</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>7.000000e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>6.144308e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>missing</th>\n",
" <th>seconds</th>\n",
" <td>2.871231e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>network</th>\n",
" <th>seconds</th>\n",
" <td>1.084494e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>other</th>\n",
" <th>seconds</th>\n",
" <td>7.154693e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>serialize</th>\n",
" <th>seconds</th>\n",
" <td>1.452420e-02</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"10\" valign=\"top\">get-data</th>\n",
" <th rowspan=\"10\" valign=\"top\"></th>\n",
" <th>compress</th>\n",
" <th>seconds</th>\n",
" <td>1.499470e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>decompress</th>\n",
" <th>seconds</th>\n",
" <td>8.457677e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>deserialize</th>\n",
" <th>seconds</th>\n",
" <td>1.146060e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-read</th>\n",
" <th>bytes</th>\n",
" <td>1.298182e+09</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>2.820000e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>1.565931e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">memory-read</th>\n",
" <th>bytes</th>\n",
" <td>6.626876e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>4.898000e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>network</th>\n",
" <th>seconds</th>\n",
" <td>1.244312e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>serialize</th>\n",
" <th>seconds</th>\n",
" <td>4.049585e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"5\" valign=\"top\">memory-monitor</th>\n",
" <th rowspan=\"5\" valign=\"top\"></th>\n",
" <th>compress</th>\n",
" <th>seconds</th>\n",
" <td>6.887015e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">disk-write</th>\n",
" <th>bytes</th>\n",
" <td>1.118508e+10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>6.300000e+02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>seconds</th>\n",
" <td>9.565273e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>serialize</th>\n",
" <th>seconds</th>\n",
" <td>1.538035e+00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" value\n",
"activity prefix action unit \n",
"execute add deserialize seconds 1.963000e-05\n",
" memory-read bytes 6.400000e+01\n",
" count 2.000000e+00\n",
" other seconds 5.759396e-04\n",
" thread-cpu seconds 2.852000e-06\n",
" thread-noncpu seconds 1.502939e-05\n",
" and decompress seconds 2.106854e+01\n",
" deserialize seconds 8.231467e-02\n",
" disk-read bytes 3.561756e+09\n",
" count 2.760000e+02\n",
" seconds 4.465114e+00\n",
" memory-read bytes 1.078697e+10\n",
" count 1.456000e+03\n",
" other seconds 8.946212e+01\n",
" thread-cpu seconds 3.873119e+00\n",
" thread-noncpu seconds 1.790220e+01\n",
" assign compress seconds 5.037202e+00\n",
" deserialize seconds 6.600524e-02\n",
" disk-write bytes 1.025898e+09\n",
" count 5.600000e+01\n",
" seconds 5.690627e-01\n",
" memory-read bytes 8.231894e+11\n",
" count 1.039200e+04\n",
" other seconds 1.446904e+02\n",
" serialize seconds 9.702521e-02\n",
" thread-cpu seconds 8.564522e+01\n",
" thread-noncpu seconds 5.076369e+01\n",
" astype deserialize seconds 2.387048e-02\n",
" memory-read bytes 2.049516e+11\n",
" count 1.732000e+03\n",
" other seconds 1.104970e+02\n",
" thread-cpu seconds 4.481759e+02\n",
" thread-noncpu seconds 6.304594e+02\n",
" categorize_block deserialize seconds 4.063422e-02\n",
" memory-read bytes 6.502900e+10\n",
" count 8.660000e+02\n",
" other seconds 5.076183e+00\n",
" thread-cpu seconds 1.189111e+02\n",
" thread-noncpu seconds 5.199587e+01\n",
" drop_by_shallow_copy compress seconds 5.581967e-01\n",
" deserialize seconds 8.662685e-02\n",
" disk-write bytes 1.039745e+08\n",
" count 5.000000e+00\n",
" seconds 5.186886e-02\n",
" memory-read bytes 7.398934e+11\n",
" count 3.464000e+03\n",
" other seconds 1.789927e+02\n",
" serialize seconds 1.816554e-02\n",
" thread-cpu seconds 1.469329e+02\n",
" thread-noncpu seconds 6.786118e+01\n",
" dropna compress seconds 1.379998e+00\n",
" deserialize seconds 2.179858e-02\n",
" disk-write bytes 3.136404e+08\n",
" count 1.700000e+01\n",
" seconds 1.615429e-01\n",
" memory-read bytes 1.164748e+11\n",
" count 1.732000e+03\n",
" other seconds 3.533512e+01\n",
" serialize seconds 3.112212e-02\n",
" thread-cpu seconds 7.334023e+01\n",
" thread-noncpu seconds 6.504962e+01\n",
" dt-dayofweek deserialize seconds 1.171772e-02\n",
" memory-read bytes 1.743413e+10\n",
" count 8.660000e+02\n",
" other seconds 4.081135e+01\n",
" thread-cpu seconds 7.334018e+01\n",
" thread-noncpu seconds 2.022717e+01\n",
" dt-hour compress seconds 3.543061e-01\n",
" deserialize seconds 1.280281e-02\n",
" disk-write bytes 7.677210e+07\n",
" count 4.000000e+00\n",
" seconds 3.805964e-02\n",
" memory-read bytes 1.743413e+10\n",
" count 8.660000e+02\n",
" other seconds 3.615897e+01\n",
" serialize seconds 7.050185e-03\n",
" thread-cpu seconds 6.193667e+01\n",
" thread-noncpu seconds 1.932684e+01\n",
" dt-month compress seconds 3.132066e-01\n",
" deserialize seconds 1.075102e-02\n",
" disk-write bytes 7.230944e+07\n",
" count 3.000000e+00\n",
" seconds 3.577726e-02\n",
" memory-read bytes 1.743413e+10\n",
" count 8.660000e+02\n",
" other seconds 4.042804e+01\n",
" serialize seconds 1.749212e-02\n",
" thread-cpu seconds 6.166762e+01\n",
" thread-noncpu seconds 1.556672e+01\n",
" fillna compress seconds 2.103873e-01\n",
" deserialize seconds 1.057908e-02\n",
" disk-write bytes 6.552972e+07\n",
" count 2.000000e+00\n",
" seconds 3.389299e-02\n",
" memory-read bytes 1.743413e+10\n",
" count 8.660000e+02\n",
" other seconds 2.228680e+01\n",
" serialize seconds 7.386675e-03\n",
" thread-cpu seconds 9.035824e+00\n",
" thread-noncpu seconds 9.276757e+00\n",
" from_pandas deserialize seconds 2.684000e-06\n",
" other seconds 1.270471e-03\n",
" thread-cpu seconds 3.502000e-06\n",
" thread-noncpu seconds 1.437939e-05\n",
" ge compress seconds 8.832241e-02\n",
" deserialize seconds 8.445263e-03\n",
" disk-write bytes 1.819005e+07\n",
" count 1.000000e+00\n",
" seconds 9.253741e-03\n",
" memory-read bytes 1.176653e+10\n",
" count 8.660000e+02\n",
" other seconds 2.528699e+01\n",
" serialize seconds 1.567120e-04\n",
" thread-cpu seconds 1.376355e+00\n",
" thread-noncpu seconds 1.409568e+00\n",
" get-categories-agg deserialize seconds 1.408131e-03\n",
" memory-read bytes 2.398915e+07\n",
" count 9.250000e+02\n",
" other seconds 1.943847e+00\n",
" thread-cpu seconds 4.902417e-01\n",
" thread-noncpu seconds 4.559618e+00\n",
" get-categories-chunk deserialize seconds 2.088719e-02\n",
" memory-read bytes 6.502901e+10\n",
" count 8.660000e+02\n",
" other seconds 4.001039e+01\n",
" thread-cpu seconds 1.461580e+00\n",
" thread-noncpu seconds 3.922195e-01\n",
" getitem compress seconds 1.663258e-01\n",
" deserialize seconds 6.212383e-02\n",
" disk-write bytes 3.115353e+07\n",
" count 3.000000e+00\n",
" seconds 2.198169e-02\n",
" memory-read bytes 7.733279e+11\n",
" count 5.196000e+03\n",
" other seconds 1.008451e+02\n",
" serialize seconds 4.681260e-04\n",
" thread-cpu seconds 6.541796e-01\n",
" thread-noncpu seconds 1.097014e-01\n",
" isnull deserialize seconds 8.831830e-03\n",
" memory-read bytes 1.743413e+10\n",
" count 8.660000e+02\n",
" other seconds 1.839326e+01\n",
" thread-cpu seconds 1.916485e+00\n",
" thread-noncpu seconds 1.843588e+00\n",
" le decompress seconds 2.328353e+01\n",
" deserialize seconds 8.452431e-02\n",
" disk-read bytes 5.173490e+09\n",
" count 2.920000e+02\n",
" seconds 6.826033e+00\n",
" memory-read bytes 6.015780e+09\n",
" count 1.440000e+03\n",
" other seconds 7.423455e+01\n",
" thread-cpu seconds 2.143544e+00\n",
" thread-noncpu seconds 3.932911e+00\n",
" loc-series compress seconds 9.286848e-01\n",
" decompress seconds 6.460255e+01\n",
" deserialize seconds 1.848922e+00\n",
" disk-read bytes 1.121431e+10\n",
" count 2.970000e+02\n",
" seconds 1.038736e+01\n",
" disk-write bytes 1.866309e+08\n",
" count 8.000000e+00\n",
" seconds 1.739051e-01\n",
" memory-read bytes 7.417926e+10\n",
" count 1.435000e+03\n",
" other seconds 9.591003e+01\n",
" serialize seconds 2.044885e-02\n",
" thread-cpu seconds 9.156853e+01\n",
" thread-noncpu seconds 1.374590e+02\n",
" merge_chunk compress seconds 6.296406e-01\n",
" deserialize seconds 4.459591e-02\n",
" disk-write bytes 1.373803e+08\n",
" count 6.000000e+00\n",
" seconds 6.721934e-02\n",
" memory-read bytes 2.631508e+11\n",
" count 3.464000e+03\n",
" other seconds 1.961889e+02\n",
" serialize seconds 1.260667e-02\n",
" thread-cpu seconds 8.940670e+02\n",
" thread-noncpu seconds 1.163169e+03\n",
" mul deserialize seconds 2.368600e-05\n",
" memory-read bytes 3.200000e+01\n",
" count 1.000000e+00\n",
" other seconds 4.977354e-04\n",
" thread-cpu seconds 3.760000e-06\n",
" thread-noncpu seconds 1.793609e-05\n",
" quantiles decompress seconds 1.620960e-04\n",
" deserialize seconds 3.868425e-02\n",
" disk-read bytes 1.234200e+04\n",
" count 3.300000e+01\n",
" seconds 1.027950e-03\n",
" memory-read bytes 1.176662e+10\n",
" count 1.699000e+03\n",
" other seconds 1.844720e+01\n",
" thread-cpu seconds 1.946719e+01\n",
" thread-noncpu seconds 7.694072e+00\n",
" read-parquet I/O seconds 2.280538e+03\n",
" compress seconds 1.787037e+00\n",
" deserialize seconds 2.358927e-02\n",
" disk-write bytes 3.919784e+08\n",
" count 2.100000e+01\n",
" seconds 2.059484e-01\n",
" other seconds 4.874290e+01\n",
" serialize seconds 4.412802e-02\n",
" thread-cpu seconds 0.000000e+00\n",
" thread-noncpu seconds 1.003523e-01\n",
" rename compress seconds 1.310685e+00\n",
" deserialize seconds 4.025434e-02\n",
" disk-write bytes 2.735803e+08\n",
" count 1.200000e+01\n",
" seconds 2.001524e-01\n",
" memory-read bytes 3.723729e+11\n",
" count 1.732000e+03\n",
" other seconds 1.429023e+02\n",
" serialize seconds 2.803826e-02\n",
" thread-cpu seconds 2.028315e+02\n",
" thread-noncpu seconds 2.777587e+02\n",
" repartition compress seconds 2.022075e+00\n",
" deserialize seconds 1.382049e-02\n",
" disk-write bytes 4.198203e+08\n",
" count 2.700000e+01\n",
" seconds 2.140520e-01\n",
" memory-read bytes 8.198742e+10\n",
" count 1.294000e+03\n",
" other seconds 2.047477e+01\n",
" serialize seconds 3.934864e-02\n",
" thread-cpu seconds 6.999167e+01\n",
" thread-noncpu seconds 2.744740e+01\n",
" repartition-split compress seconds 2.732344e+00\n",
" deserialize seconds 8.215349e-03\n",
" disk-write bytes 5.980626e+08\n",
" count 3.400000e+01\n",
" seconds 3.062755e-01\n",
" memory-read bytes 4.649859e+11\n",
" count 1.294000e+03\n",
" other seconds 1.319431e+01\n",
" serialize seconds 7.675315e-02\n",
" thread-cpu seconds 6.208843e-03\n",
" thread-noncpu seconds 2.789240e-02\n",
" replace deserialize seconds 1.007822e-02\n",
" memory-read bytes 1.359723e+10\n",
" count 8.660000e+02\n",
" other seconds 1.772804e+01\n",
" thread-cpu seconds 4.456288e+01\n",
" thread-noncpu seconds 1.729192e+01\n",
" split compress seconds 2.689857e+01\n",
" deserialize seconds 8.523750e-04\n",
" disk-write bytes 6.223999e+09\n",
" count 3.450000e+02\n",
" seconds 3.094027e+00\n",
" memory-read bytes 4.098688e+10\n",
" count 4.500000e+01\n",
" other seconds 5.599360e+00\n",
" serialize seconds 6.142642e-01\n",
" thread-cpu seconds 6.445540e-02\n",
" thread-noncpu seconds 2.589523e-02\n",
" str_cat deserialize seconds 1.654157e-02\n",
" memory-read bytes 7.512703e+10\n",
" count 1.732000e+03\n",
" other seconds 6.471378e+01\n",
" thread-cpu seconds 6.781931e+02\n",
" thread-noncpu seconds 9.797700e+01\n",
" sub deserialize seconds 3.815400e-05\n",
" memory-read bytes 3.200000e+01\n",
" count 1.000000e+00\n",
" other seconds 1.622431e-03\n",
" thread-cpu seconds 5.666000e-06\n",
" thread-noncpu seconds 2.032163e-05\n",
" total_mem_usage I/O seconds 2.919971e+03\n",
" deserialize seconds 3.251624e+00\n",
" memory-read bytes 6.502950e+10\n",
" count 8.660000e+02\n",
" other seconds 1.538037e+01\n",
" thread-cpu seconds 1.386170e+00\n",
" thread-noncpu seconds 2.262479e+00\n",
"gather-dep busy seconds 1.905684e+00\n",
" cancelled seconds 2.891501e+02\n",
" compress seconds 6.130827e-01\n",
" decompress seconds 1.296874e+02\n",
" deserialize seconds 1.180477e+01\n",
" disk-write bytes 1.237622e+08\n",
" count 7.000000e+00\n",
" seconds 6.144308e-02\n",
" missing seconds 2.871231e+00\n",
" network seconds 1.084494e+03\n",
" other seconds 7.154693e+01\n",
" serialize seconds 1.452420e-02\n",
"get-data compress seconds 1.499470e+02\n",
" decompress seconds 8.457677e+00\n",
" deserialize seconds 1.146060e-01\n",
" disk-read bytes 1.298182e+09\n",
" count 2.820000e+02\n",
" seconds 1.565931e+00\n",
" memory-read bytes 6.626876e+10\n",
" count 4.898000e+03\n",
" network seconds 1.244312e+03\n",
" serialize seconds 4.049585e+01\n",
"memory-monitor compress seconds 6.887015e+01\n",
" disk-write bytes 1.118508e+10\n",
" count 6.300000e+02\n",
" seconds 9.565273e+00\n",
" serialize seconds 1.538035e+00"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df"
]
},
{
"cell_type": "markdown",
"id": "a507b4a3",
"metadata": {},
"source": [
"### Breakdown of execute()\n",
"\n",
"We're adding to the metrics an idle time, defined as follows:\n",
"\n",
"```\n",
"idle threads \n",
"= end-to-end runtime as seen from the client \n",
"* number of cluster threads\n",
"- sum of all other timings \n",
"```\n",
"Idle time can be caused by:\n",
"- client<->scheduler comm time\n",
"- initial decision time from the scheduler\n",
"- the algorithm having many serial chokepoints\n",
"- scheduler not being fast enough to push tasks to the workers\n",
"\n",
"The only \"good\" times are thread-cpu and I/O.\n",
"\n",
"We can see that we're wasting **half** of the cluster time!!!\n",
"\n",
"Besides idle time, other glaring sources of waste are:\n",
"- \"other\": this is highlighting a slow event loop and/or a high overhead from the thread pool.\n",
"- \"thread-noncpu\": either the GIL or I/O - read below for analysis"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "49022bd2",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot: ylabel='value'>"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAfQAAAGFCAYAAAALqAHuAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAABbnUlEQVR4nO3dd3hUZdrH8e+ZmUx6D2kkhBIgIAiEGjqCgiBSLIjuq8gq6yqLuCh2xY4Fe18V0LUuCIKgIAIqKJGEDqEECB1CAimTNu28f4SMRlog5cycuT/XlSvJzJkzdwaS3zznOed+FFVVVYQQQgjh0QxaFyCEEEKI2pNAF0IIIXRAAl0IIYTQAQl0IYQQQgck0IUQQggdkEAXQgghdEACXQghhNABCXQhhBBCByTQhRBCCB2QQBdCCCF0QAJdCCGE0AEJdCGEEEIHJNCFEEIIHZBAF0IIIXRAAl0IIYTQAQl0IYQQQgck0IUQQggdkEAXQgghdEACXQghhNABCXQhhBBCByTQhRBCCB2QQBdCCCF0QAJdCCGE0AEJdCGEEEIHJNCFEEIIHZBAF0IIIXRAAl0IIYTQAQl0IYQQQgck0IUQQggdkEAXQgghdEACXQghhNABCXQhhBBCByTQhRBCCB2QQBdCCCF0QAJdCCGE0AEJdCGEEEIHJNCFEEIIHZBAF0LoRv/+/Zk8efI5t2natCmvvvqq63tFUZg/f74mtTSkWbNmERYWpnUZoh6ZtC5ACCHqytdff42Pj0+DPufKlSsZMGAAJ0+elMAUmpJAF0LoRkREhNYl1IrNZmvwNyRCP+SQuxBCN/56mDs3N5fhw4fj7+9Ps2bN+PTTT8+7j0OHDjFmzBjCw8OJjIxkxIgR5OTknHHbnJwcBgwYAEB4eDiKojBu3DjX/U6nk6lTpxIREUFsbCzTpk2r9nhFUXj33XcZMWIEgYGBPP300wAsXLiQzp074+fnR/PmzXniiSew2+2ux7388su0b9+ewMBAEhMTufPOO7FYLNX2PWvWLJo0aUJAQACjRo0iPz+/2v0bN25kwIABBAcHExISQufOncnIyDjv6yPclwS6EEK3xo0bR05ODsuXL2fOnDm8/fbb5ObmnnX70tJSBgwYQFBQED///DOrVq0iKCiIIUOGYLVaT9s+MTGRuXPnArBjxw6OHDnCa6+95rp/9uzZBAYGkp6ezgsvvMCTTz7JDz/8UG0fjz/+OCNGjGDz5s2MHz+eJUuW8Le//Y1Jkyaxbds23nvvPWbNmsUzzzzjeozBYOD1119ny5YtzJ49m+XLlzN16lTX/enp6YwfP54777yTDRs2MGDAANebhSo33XQTCQkJrF27lszMTB544AE5OuDpVCGE0Il+/fqpd999t6qqqrpjxw4VUNesWeO6PysrSwXUV155xXUboM6bN09VVVX98MMP1datW6tOp9N1f0VFherv768uWbLkjM+5YsUKFVBPnjx5Wi29e/eudlvXrl3V+++/v9pzT548udo2ffr0UZ999tlqt33yySdqXFzcWX/ur776So2MjHR9P3bsWHXIkCHVthkzZowaGhrq+j44OFidNWvWWfcpPI+M0IUQupSVlYXJZKJLly6u21JSUs554lpmZibZ2dkEBwcTFBREUFAQERERlJeXs3v37guu4dJLL632fVxc3GlHCP5cX1UNTz75pOv5g4KCuP322zly5AilpaUArFixgssvv5zGjRsTHBzMzTffTH5+PiUlJa6fPS0trdp+//r9v//9b2677TYGDRrE9OnTL+rnE+5FTooTQuiSqqpA5Tx1TTmdTjp37nzGufZGjRpdcA1/PYStKApOp7PabYGBgafV8MQTTzB69OjT9ufn58e+ffsYOnQod9xxB0899RQRERGsWrWKv//979hsNuCPn/1cpk2bxo033siiRYv47rvvePzxx/niiy8YNWrUhf6Ywk1IoAvhhpxOGzZ7IXZbAbaqD3sBdlshNlsBdnsxTtUGqhMVJ6rqQCGYHTsuxWAwYDQaMRgM1b42m80EBQURHBzs+ggICND6R603bdq0wW63k5GRQbdu3YDKee6CgoKzPiY1NZUvv/yS6OhoQkJCavQ8ZrMZAIfDUeuaq2rYsWMHycnJZ7w/IyMDu93OjBkzMBgqD7J+9dVX1bZp27Yta9asqXbbX78HaNWqFa1ateKee+5h7NixzJw5UwLdg0mgC6EBm62IsrIcSktzKC3bR9mpz9aKY9jshTgcJRe8T7M5no0bzz8y+zOTyURQUBAhISHVgv7PHyEhIa7Q8iStW7dmyJAh3H777bz//vuYTCYmT56Mv7//WR9z00038eKLLzJixAiefPJJEhIS2L9/P19//TX33XcfCQkJpz0mKSkJRVH49ttvGTp0KP7+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\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df2 = df.reset_index()\n",
"execute_actions = df2[\n",
" (df2.activity == \"execute\") & (df2.unit == \"seconds\")\n",
"].groupby(\"action\").sum(numeric_only=True).value\n",
"execute_actions[\"idle threads\"] = (t1 - t0) * 40 - sum(execute_actions)\n",
"execute_actions.sort_values().plot.pie()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "4fd6d25c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"action\n",
"serialize 0.000069\n",
"disk-write 0.000354\n",
"deserialize 0.000400\n",
"disk-read 0.001481\n",
"compress 0.003034\n",
"decompress 0.007442\n",
"other 0.109534\n",
"idle threads 0.127391\n",
"thread-noncpu 0.183854\n",
"thread-cpu 0.211252\n",
"I/O 0.355190\n",
"Name: value, dtype: float64"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(execute_actions / execute_actions.sum()).sort_values()"
]
},
{
"cell_type": "markdown",
"id": "20b0138f",
"metadata": {},
"source": [
"### Investigate thread-noncpu\n",
"Which task prefixes are most responsible for non-CPU time while executing threads?\n",
"Did we forget to tag an I/O task in dask/dask?\n",
"The breakdown below says we don't - which is a fairly clear indicator of **death by GIL**."
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "e30c8ae5",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<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 border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>action</th>\n",
" <th>thread-cpu</th>\n",
" <th>thread-noncpu</th>\n",
" <th>noncpu %</th>\n",
" </tr>\n",
" <tr>\n",
" <th>prefix</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>from_pandas</th>\n",
" <td>0.000004</td>\n",
" <td>0.000014</td>\n",
" <td>0.804154</td>\n",
" </tr>\n",
" <tr>\n",
" <th>add</th>\n",
" <td>0.000003</td>\n",
" <td>0.000015</td>\n",
" <td>0.840505</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mul</th>\n",
" <td>0.000004</td>\n",
" <td>0.000018</td>\n",
" <td>0.826697</td>\n",
" </tr>\n",
" <tr>\n",
" <th>sub</th>\n",
" <td>0.000006</td>\n",
" <td>0.000020</td>\n",
" <td>0.781973</td>\n",
" </tr>\n",
" <tr>\n",
" <th>split</th>\n",
" <td>0.064455</td>\n",
" <td>0.025895</td>\n",
" <td>0.286608</td>\n",
" </tr>\n",
" <tr>\n",
" <th>repartition-split</th>\n",
" <td>0.006209</td>\n",
" <td>0.027892</td>\n",
" <td>0.817929</td>\n",
" </tr>\n",
" <tr>\n",
" <th>read-parquet</th>\n",
" <td>0.000000</td>\n",
" <td>0.100352</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>getitem</th>\n",
" <td>0.654180</td>\n",
" <td>0.109701</td>\n",
" <td>0.143611</td>\n",
" </tr>\n",
" <tr>\n",
" <th>get-categories-chunk</th>\n",
" <td>1.461580</td>\n",
" <td>0.392220</td>\n",
" <td>0.211576</td>\n",
" </tr>\n",
" <tr>\n",
" <th>ge</th>\n",
" <td>1.376355</td>\n",
" <td>1.409568</td>\n",
" <td>0.505961</td>\n",
" </tr>\n",
" <tr>\n",
" <th>isnull</th>\n",
" <td>1.916485</td>\n",
" <td>1.843588</td>\n",
" <td>0.490306</td>\n",
" </tr>\n",
" <tr>\n",
" <th>total_mem_usage</th>\n",
" <td>1.386170</td>\n",
" <td>2.262479</td>\n",
" <td>0.620087</td>\n",
" </tr>\n",
" <tr>\n",
" <th>le</th>\n",
" <td>2.143544</td>\n",
" <td>3.932911</td>\n",
" <td>0.647238</td>\n",
" </tr>\n",
" <tr>\n",
" <th>get-categories-agg</th>\n",
" <td>0.490242</td>\n",
" <td>4.559618</td>\n",
" <td>0.902920</td>\n",
" </tr>\n",
" <tr>\n",
" <th>quantiles</th>\n",
" <td>19.467193</td>\n",
" <td>7.694072</td>\n",
" <td>0.283274</td>\n",
" </tr>\n",
" <tr>\n",
" <th>fillna</th>\n",
" <td>9.035824</td>\n",
" <td>9.276757</td>\n",
" <td>0.506578</td>\n",
" </tr>\n",
" <tr>\n",
" <th>dt-month</th>\n",
" <td>61.667623</td>\n",
" <td>15.566725</td>\n",
" <td>0.201552</td>\n",
" </tr>\n",
" <tr>\n",
" <th>replace</th>\n",
" <td>44.562879</td>\n",
" <td>17.291919</td>\n",
" <td>0.279557</td>\n",
" </tr>\n",
" <tr>\n",
" <th>and</th>\n",
" <td>3.873119</td>\n",
" <td>17.902204</td>\n",
" <td>0.822133</td>\n",
" </tr>\n",
" <tr>\n",
" <th>dt-hour</th>\n",
" <td>61.936668</td>\n",
" <td>19.326843</td>\n",
" <td>0.237829</td>\n",
" </tr>\n",
" <tr>\n",
" <th>dt-dayofweek</th>\n",
" <td>73.340177</td>\n",
" <td>20.227170</td>\n",
" <td>0.216178</td>\n",
" </tr>\n",
" <tr>\n",
" <th>repartition</th>\n",
" <td>69.991666</td>\n",
" <td>27.447395</td>\n",
" <td>0.281688</td>\n",
" </tr>\n",
" <tr>\n",
" <th>assign</th>\n",
" <td>85.645224</td>\n",
" <td>50.763689</td>\n",
" <td>0.372143</td>\n",
" </tr>\n",
" <tr>\n",
" <th>categorize_block</th>\n",
" <td>118.911112</td>\n",
" <td>51.995866</td>\n",
" <td>0.304235</td>\n",
" </tr>\n",
" <tr>\n",
" <th>dropna</th>\n",
" <td>73.340234</td>\n",
" <td>65.049620</td>\n",
" <td>0.470046</td>\n",
" </tr>\n",
" <tr>\n",
" <th>drop_by_shallow_copy</th>\n",
" <td>146.932939</td>\n",
" <td>67.861184</td>\n",
" <td>0.315936</td>\n",
" </tr>\n",
" <tr>\n",
" <th>str_cat</th>\n",
" <td>678.193138</td>\n",
" <td>97.977001</td>\n",
" <td>0.126231</td>\n",
" </tr>\n",
" <tr>\n",
" <th>loc-series</th>\n",
" <td>91.568525</td>\n",
" <td>137.458958</td>\n",
" <td>0.600185</td>\n",
" </tr>\n",
" <tr>\n",
" <th>rename</th>\n",
" <td>202.831485</td>\n",
" <td>277.758741</td>\n",
" <td>0.577953</td>\n",
" </tr>\n",
" <tr>\n",
" <th>astype</th>\n",
" <td>448.175915</td>\n",
" <td>630.459415</td>\n",
" <td>0.584497</td>\n",
" </tr>\n",
" <tr>\n",
" <th>merge_chunk</th>\n",
" <td>894.067032</td>\n",
" <td>1163.168770</td>\n",
" <td>0.565404</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"action thread-cpu thread-noncpu noncpu %\n",
"prefix \n",
"from_pandas 0.000004 0.000014 0.804154\n",
"add 0.000003 0.000015 0.840505\n",
"mul 0.000004 0.000018 0.826697\n",
"sub 0.000006 0.000020 0.781973\n",
"split 0.064455 0.025895 0.286608\n",
"repartition-split 0.006209 0.027892 0.817929\n",
"read-parquet 0.000000 0.100352 1.000000\n",
"getitem 0.654180 0.109701 0.143611\n",
"get-categories-chunk 1.461580 0.392220 0.211576\n",
"ge 1.376355 1.409568 0.505961\n",
"isnull 1.916485 1.843588 0.490306\n",
"total_mem_usage 1.386170 2.262479 0.620087\n",
"le 2.143544 3.932911 0.647238\n",
"get-categories-agg 0.490242 4.559618 0.902920\n",
"quantiles 19.467193 7.694072 0.283274\n",
"fillna 9.035824 9.276757 0.506578\n",
"dt-month 61.667623 15.566725 0.201552\n",
"replace 44.562879 17.291919 0.279557\n",
"and 3.873119 17.902204 0.822133\n",
"dt-hour 61.936668 19.326843 0.237829\n",
"dt-dayofweek 73.340177 20.227170 0.216178\n",
"repartition 69.991666 27.447395 0.281688\n",
"assign 85.645224 50.763689 0.372143\n",
"categorize_block 118.911112 51.995866 0.304235\n",
"dropna 73.340234 65.049620 0.470046\n",
"drop_by_shallow_copy 146.932939 67.861184 0.315936\n",
"str_cat 678.193138 97.977001 0.126231\n",
"loc-series 91.568525 137.458958 0.600185\n",
"rename 202.831485 277.758741 0.577953\n",
"astype 448.175915 630.459415 0.584497\n",
"merge_chunk 894.067032 1163.168770 0.565404"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cpu_to_noncpu = (\n",
" df2[(df2.action == \"thread-noncpu\") | (df2.action == \"thread-cpu\")]\n",
" .groupby([\"prefix\", \"action\"])\n",
" .sum(numeric_only=True)\n",
" .reset_index()\n",
" .pivot(index=\"prefix\", columns=\"action\", values=\"value\")\n",
")\n",
"cpu_to_noncpu[\"noncpu %\"] = cpu_to_noncpu[\"thread-noncpu\"] / cpu_to_noncpu.sum(axis=1)\n",
"cpu_to_noncpu = cpu_to_noncpu.sort_values(\"thread-noncpu\")\n",
"cpu_to_noncpu"
]
},
{
"cell_type": "markdown",
"id": "86706085",
"metadata": {},
"source": [
"### Investigate task runtime\n",
"In which tasks are we spending the most time (CPU, I/O, and waste all together)?"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "7a57fec8",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot: ylabel='value'>"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df2[\n",
" (df2.activity == \"execute\") & (df2.unit == \"seconds\")\n",
"].groupby([\"prefix\"]).sum(numeric_only=True).value.sort_values().plot.pie()"
]
},
{
"cell_type": "markdown",
"id": "4bf7c9bb",
"metadata": {},
"source": [
"### Unspill activity\n",
"How frequently are execute and get-data unspilling keys?\n",
"Below we have counts of tasks being read."
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "57b4fc31",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<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 border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>action</th>\n",
" <th>disk-read</th>\n",
" <th>memory-read</th>\n",
" <th>cache hit ratio</th>\n",
" </tr>\n",
" <tr>\n",
" <th>activity</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>execute</th>\n",
" <td>898</td>\n",
" <td>47696</td>\n",
" <td>0.98152</td>\n",
" </tr>\n",
" <tr>\n",
" <th>get-data</th>\n",
" <td>282</td>\n",
" <td>4898</td>\n",
" <td>0.94556</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"action disk-read memory-read cache hit ratio\n",
"activity \n",
"execute 898 47696 0.98152\n",
"get-data 282 4898 0.94556"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cache_hits = df2[\n",
" ((df2.action == \"memory-read\") | (df2.action == \"disk-read\"))\n",
" & (df2.unit == \"count\")\n",
"].groupby([\"activity\", \"action\"]).sum(numeric_only=True).reset_index().pivot(\n",
" index=\"activity\", columns=\"action\", values=\"value\"\n",
").astype(int)\n",
"cache_hits[\"cache hit ratio\"] = cache_hits[\"memory-read\"] / cache_hits.sum(axis=1)\n",
"cache_hits"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2ecf6f69",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.10.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment