diff --git a/notebooks/2.1_Single-file.ipynb b/notebooks/2.1_Single-file.ipynb index e2cff51..2cca93e 100644 --- a/notebooks/2.1_Single-file.ipynb +++ b/notebooks/2.1_Single-file.ipynb @@ -65,15 +65,15 @@ "}\n", "\n", "column_presets = {\n", - " # \"100pct\": {\n", - " # # the bechmark will limit this to actual total number of columns\n", - " # \"method\": \"n_columns\",\n", - " # \"values\": 100000\n", - " # },\n", - " # \"50pct\": {\n", - " # \"method\": \"collections\",\n", - " # \"values\": [\"Jet\", \"Photon\", \"Tau\", \"Electron\", \"Muon\"]\n", - " # },\n", + " \"100pct\": {\n", + " # the bechmark will limit this to actual total number of columns\n", + " \"method\": \"n_columns\",\n", + " \"values\": 100000\n", + " },\n", + " \"50pct\": {\n", + " \"method\": \"collections\",\n", + " \"values\": [\"Jet\", \"Photon\", \"Tau\", \"Electron\", \"Muon\"]\n", + " },\n", " \"10pct\": {\n", " \"method\": \"collections\",\n", " \"values\": [\"Muon\"]\n", @@ -101,7 +101,7 @@ " recreate_dir(save_dir)\n", "\n", " iconf = 0\n", - " repeat = 3\n", + " repeat = 5\n", "\n", " for f_label, file_loc in file_locations.items():\n", " for c_label, column_setup in column_presets.items():\n", @@ -139,31 +139,13 @@ "source": [ "# warning: all YAML files will be deleted from config directory before proceeding\n", "config_path = \"./configs_2.1\"\n", - "output_path = \"./outputs_2.1\"" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "8633cf12-d9d9-4201-8969-e40868ee2e65", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Directory ./configs_2.1 already exists, will clean all files from it.\n", - "Saved 30 config files to ./configs_2.1\n" - ] - } - ], - "source": [ + "output_path = \"./outputs_2.1\"\n", "generate_configs(config_path)" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "d0ed6b4f-1ce8-4731-87e7-57da3b4abced", "metadata": {}, "outputs": [ @@ -178,7 +160,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "100%|██████████| 30/30 [17:30<00:00, 35.01s/it]\n" + " 1%| | 1/100 [00:19<31:37, 19.16s/it]" ] } ], @@ -233,260 +215,107 @@ " \n", " 0\n", " 1\n", - " 50\n", - " 154321550\n", + " 1249\n", + " 3854952319\n", " True\n", " 0\n", " sequential\n", " 1\n", - " 265594188\n", - " 1129031467\n", - " 30.459931\n", - " 0.030563\n", - " 24.061388\n", - " 10pct\n", + " 2048077850\n", + " 11568311796\n", + " 246.806087\n", + " 0.494070\n", + " 166.181469\n", + " 100pct\n", " depot\n", " \n", " \n", " 1\n", " 1\n", - " 50\n", - " 154321550\n", + " 1249\n", + " 3854952319\n", " True\n", " 0\n", " sequential\n", " 1\n", - " 265594188\n", - " 1129031467\n", - " 30.506349\n", - " 0.031068\n", - " 24.128228\n", - " 10pct\n", + " 2048077850\n", + " 11568311796\n", + " 242.890458\n", + " 0.494278\n", + " 162.216860\n", + " 100pct\n", " depot\n", " \n", " \n", " 2\n", " 1\n", - " 50\n", - " 154321550\n", + " 1249\n", + " 3854952319\n", " True\n", " 0\n", " sequential\n", " 1\n", - " 265594188\n", - " 1129031467\n", - " 30.462117\n", - " 0.030792\n", - " 24.097522\n", - " 10pct\n", + " 2048077850\n", + " 11568311796\n", + " 242.882858\n", + " 0.492016\n", + " 162.148665\n", + " 100pct\n", " depot\n", " \n", " \n", " 3\n", " 1\n", - " 50\n", - " 154321550\n", + " 1249\n", + " 3854952319\n", " True\n", " 0\n", " sequential\n", " 1\n", - " 265594188\n", - " 1129031467\n", - " 30.513377\n", - " 0.030538\n", - " 24.048350\n", - " 10pct\n", - " eos_fuse\n", + " 2048077850\n", + " 11568311796\n", + " 242.313256\n", + " 0.490587\n", + " 161.856776\n", + " 100pct\n", + " depot\n", " \n", " \n", " 4\n", " 1\n", - " 50\n", - " 154321550\n", + " 1249\n", + " 3854952319\n", " True\n", " 0\n", " sequential\n", " 1\n", - " 265594188\n", - " 1129031467\n", - " 30.442081\n", - " 0.030833\n", - " 24.080730\n", - " 10pct\n", - " eos_fuse\n", - " \n", - " \n", - " 5\n", - " 1\n", - " 50\n", - " 154321550\n", - " True\n", - " 0\n", - " sequential\n", - " 1\n", - " 265594188\n", - " 1129031467\n", - " 30.533058\n", - " 0.030703\n", - " 24.076658\n", - " 10pct\n", - " eos_fuse\n", - " \n", - " \n", - " 6\n", - " 1\n", - " 50\n", - " 154321550\n", - " True\n", - " 0\n", - " sequential\n", - " 1\n", - " 265594188\n", - " 1129031467\n", - " 34.893134\n", - " 0.030747\n", - " 24.201373\n", - " 10pct\n", - " work\n", - " \n", - " \n", - " 7\n", - " 1\n", - " 50\n", - " 154321550\n", - " True\n", - " 0\n", - " sequential\n", - " 1\n", - " 265594188\n", - " 1129031467\n", - " 30.539464\n", - " 0.030596\n", - " 24.140102\n", - " 10pct\n", - " work\n", - " \n", - " \n", - " 8\n", - " 1\n", - " 50\n", - " 154321550\n", - " True\n", - " 0\n", - " sequential\n", - " 1\n", - " 265594188\n", - " 1129031467\n", - " 30.569113\n", - " 0.030507\n", - " 24.164185\n", - " 10pct\n", - " work\n", - " \n", - " \n", - " 9\n", - " 1\n", - " 50\n", - " 154321550\n", - " True\n", - " 0\n", - " sequential\n", - " 1\n", - " 265594188\n", - " 1129031467\n", - " 32.927919\n", - " 0.320015\n", - " 24.198597\n", - " 10pct\n", - " xcache\n", - " \n", - " \n", - " 10\n", - " 1\n", - " 50\n", - " 154321550\n", - " True\n", - " 0\n", - " sequential\n", - " 1\n", - " 265594188\n", - " 1129031467\n", - " 33.032840\n", - " 0.316362\n", - " 24.168849\n", - " 10pct\n", - " xcache\n", - " \n", - " \n", - " 11\n", - " 1\n", - " 50\n", - " 154321550\n", - " True\n", - " 0\n", - " sequential\n", - " 1\n", - " 265594188\n", - " 1129031467\n", - " 33.051579\n", - " 0.582236\n", - " 24.132116\n", - " 10pct\n", - " xcache\n", - " \n", - " \n", - " 12\n", - " 1\n", - " 50\n", - " 154321550\n", - " True\n", - " 0\n", - " sequential\n", - " 1\n", - " 265594188\n", - " 1129031467\n", - " 104.772271\n", - " 72.213381\n", - " 24.164070\n", - " 10pct\n", - " xrootd\n", + " 2048077850\n", + " 11568311796\n", + " 243.378389\n", + " 0.494578\n", + " 162.048801\n", + " 100pct\n", + " depot\n", " \n", " \n", - " 13\n", - " 1\n", - " 50\n", - " 154321550\n", - " True\n", - " 0\n", - " sequential\n", - " 1\n", - " 265594188\n", - " 1129031467\n", - " 62.811575\n", - " 30.291163\n", - " 24.132109\n", - " 10pct\n", - " xrootd\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", " \n", " \n", - " 14\n", - " 1\n", - " 50\n", - " 154321550\n", - " True\n", - " 0\n", - " sequential\n", - " 1\n", - " 265594188\n", - " 1129031467\n", - " 55.180227\n", - " 23.014281\n", - " 24.131685\n", - " 10pct\n", - " xrootd\n", - " \n", - " \n", - " 15\n", + " 95\n", " 1\n", " 20\n", " 61728620\n", @@ -496,14 +325,14 @@ " 1\n", " 175488912\n", " 521753090\n", - " 16.648896\n", - " 0.010548\n", - " 13.257322\n", + " 31.169582\n", + " 13.705979\n", + " 13.310637\n", " 5pct\n", - " depot\n", + " xrootd\n", " \n", " \n", - " 16\n", + " 96\n", " 1\n", " 20\n", " 61728620\n", @@ -513,14 +342,14 @@ " 1\n", " 175488912\n", " 521753090\n", - " 16.239849\n", - " 0.010682\n", - " 13.230332\n", + " 69.664148\n", + " 52.051985\n", + " 13.323399\n", " 5pct\n", - " depot\n", + " xrootd\n", " \n", " \n", - " 17\n", + " 97\n", " 1\n", " 20\n", " 61728620\n", @@ -530,14 +359,14 @@ " 1\n", " 175488912\n", " 521753090\n", - " 16.274737\n", - " 0.010654\n", - " 13.235920\n", + " 67.827847\n", + " 50.425657\n", + " 13.305850\n", " 5pct\n", - " depot\n", + " xrootd\n", " \n", " \n", - " 18\n", + " 98\n", " 1\n", " 20\n", " 61728620\n", @@ -547,14 +376,14 @@ " 1\n", " 175488912\n", " 521753090\n", - " 16.194398\n", - " 0.010595\n", - " 13.220522\n", + " 65.893562\n", + " 48.255377\n", + " 13.326851\n", " 5pct\n", - " eos_fuse\n", + " xrootd\n", " \n", " \n", - " 19\n", + " 99\n", " 1\n", " 20\n", " 61728620\n", @@ -564,317 +393,548 @@ " 1\n", " 175488912\n", " 521753090\n", - " 16.217556\n", - " 0.010699\n", - " 13.240024\n", + " 67.729488\n", + " 50.291131\n", + " 13.313098\n", " 5pct\n", - " eos_fuse\n", + " xrootd\n", + " \n", + " \n", + "\n", + "

100 rows × 14 columns

\n", + "" + ], + "text/plain": [ + " n_files n_columns_read n_events loaded_columns \\\n", + "0 1 1249 3854952319 True \n", + "1 1 1249 3854952319 True \n", + "2 1 1249 3854952319 True \n", + "3 1 1249 3854952319 True \n", + "4 1 1249 3854952319 True \n", + ".. ... ... ... ... \n", + "95 1 20 61728620 True \n", + "96 1 20 61728620 True \n", + "97 1 20 61728620 True \n", + "98 1 20 61728620 True \n", + "99 1 20 61728620 True \n", + "\n", + " worker_operation_time executor n_workers compressed_bytes \\\n", + "0 0 sequential 1 2048077850 \n", + "1 0 sequential 1 2048077850 \n", + "2 0 sequential 1 2048077850 \n", + "3 0 sequential 1 2048077850 \n", + "4 0 sequential 1 2048077850 \n", + ".. ... ... ... ... \n", + "95 0 sequential 1 175488912 \n", + "96 0 sequential 1 175488912 \n", + "97 0 sequential 1 175488912 \n", + "98 0 sequential 1 175488912 \n", + "99 0 sequential 1 175488912 \n", + "\n", + " uncompressed_bytes time:run_processor time:wait time:decompress \\\n", + "0 11568311796 246.806087 0.494070 166.181469 \n", + "1 11568311796 242.890458 0.494278 162.216860 \n", + "2 11568311796 242.882858 0.492016 162.148665 \n", + "3 11568311796 242.313256 0.490587 161.856776 \n", + "4 11568311796 243.378389 0.494578 162.048801 \n", + ".. ... ... ... ... \n", + "95 521753090 31.169582 13.705979 13.310637 \n", + "96 521753090 69.664148 52.051985 13.323399 \n", + "97 521753090 67.827847 50.425657 13.305850 \n", + "98 521753090 65.893562 48.255377 13.326851 \n", + "99 521753090 67.729488 50.291131 13.313098 \n", + "\n", + " column_setup file_location \n", + "0 100pct depot \n", + "1 100pct depot \n", + "2 100pct depot \n", + "3 100pct depot \n", + "4 100pct depot \n", + ".. ... ... \n", + "95 5pct xrootd \n", + "96 5pct xrootd \n", + "97 5pct xrootd \n", + "98 5pct xrootd \n", + "99 5pct xrootd \n", + "\n", + "[100 rows x 14 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "report.sort_values(by=['column_setup', 'file_location']).reset_index(drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "fbd5b873-2df4-40ee-bc5f-042dd7c640ec", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_186141/1348247025.py:1: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.\n", + " report.groupby(['column_setup', 'file_location']).agg('mean')\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
n_filesn_columns_readn_eventsloaded_columnsworker_operation_timen_workerscompressed_bytesuncompressed_bytestime:run_processortime:waittime:decompress
2012061728620True0sequential117548891252175309016.1414980.01058213.2362675pcteos_fusecolumn_setupfile_location
2112061728620True0sequential117548891252175309016.2056290.01078013.2846105pctwork100pctdepot1.01249.03.854952e+091.00.01.02.048078e+091.156831e+10243.6542090.493106162.890514
2212061728620True0sequential117548891252175309016.1788970.01070413.2673685pctworkeos_fuse1.01249.03.854952e+091.00.01.02.048078e+091.156831e+10244.3840490.492532163.389472
2312061728620True0sequential117548891252175309016.3418410.01081813.3273475pctworkwork1.01249.03.854952e+091.00.01.02.048078e+091.156831e+10244.7295980.492726163.492540
2412061728620True0sequential117548891252175309017.0736310.22674413.2673855pctxcachexcache1.01249.03.854952e+091.00.01.02.048078e+091.156831e+10295.8946267.241993162.952794
2512061728620True0sequential117548891252175309017.1487250.20183013.2626595pctxcachexrootd1.01249.03.854952e+091.00.01.02.048078e+091.156831e+10396.859249112.672174162.690041
2612061728620True0sequential117548891252175309017.1893370.21666513.2827495pctxcache10pctdepot1.050.01.543216e+081.00.01.02.655942e+081.129031e+0930.9862810.03147024.177480
2712061728620True0sequential117548891252175309069.02672052.12725713.2727055pctxrootdeos_fuse1.050.01.543216e+081.00.01.02.655942e+081.129031e+0930.9937360.03142324.189793
2812061728620True0sequential117548891252175309060.01388943.19848413.2592635pctxrootdwork1.050.01.543216e+081.00.01.02.655942e+081.129031e+0931.1723220.03159224.304306
2912061728620True0sequential117548891252175309072.99948356.16232913.2681135pctxrootdxcache1.050.01.543216e+081.00.01.02.655942e+081.129031e+0934.4313470.41906424.220722
xrootd1.050.01.543216e+081.00.01.02.655942e+081.129031e+0957.05568023.07596124.225699
50pctdepot1.0233.07.191384e+081.00.01.01.152109e+095.636058e+09122.0847590.14612994.383458
eos_fuse1.0233.07.191384e+081.00.01.01.152109e+095.636058e+09125.8643710.14631695.105503
work1.0233.07.191384e+081.00.01.01.152109e+095.636058e+09122.4698300.14611794.683736
xcache1.0233.07.191384e+081.00.01.01.152109e+095.636058e+09144.0090017.86597494.551497
xrootd1.0233.07.191384e+081.00.01.01.152109e+095.636058e+09195.64133860.47158094.515743
5pctdepot1.020.06.172862e+071.00.01.01.754889e+085.217531e+0816.7243320.01098713.306242
eos_fuse1.020.06.172862e+071.00.01.01.754889e+085.217531e+0816.5939390.01098513.306679
work1.020.06.172862e+071.00.01.01.754889e+085.217531e+0817.3316040.01105413.388079
xcache1.020.06.172862e+071.00.01.01.754889e+085.217531e+0817.7032810.20344113.307491
xrootd1.020.06.172862e+071.00.01.01.754889e+085.217531e+0860.45692542.94602613.315967
\n", "
" ], "text/plain": [ - " n_files n_columns_read n_events loaded_columns worker_operation_time \\\n", - "0 1 50 154321550 True 0 \n", - "1 1 50 154321550 True 0 \n", - "2 1 50 154321550 True 0 \n", - "3 1 50 154321550 True 0 \n", - "4 1 50 154321550 True 0 \n", - "5 1 50 154321550 True 0 \n", - "6 1 50 154321550 True 0 \n", - "7 1 50 154321550 True 0 \n", - "8 1 50 154321550 True 0 \n", - "9 1 50 154321550 True 0 \n", - "10 1 50 154321550 True 0 \n", - "11 1 50 154321550 True 0 \n", - "12 1 50 154321550 True 0 \n", - "13 1 50 154321550 True 0 \n", - "14 1 50 154321550 True 0 \n", - "15 1 20 61728620 True 0 \n", - "16 1 20 61728620 True 0 \n", - "17 1 20 61728620 True 0 \n", - "18 1 20 61728620 True 0 \n", - "19 1 20 61728620 True 0 \n", - "20 1 20 61728620 True 0 \n", - "21 1 20 61728620 True 0 \n", - "22 1 20 61728620 True 0 \n", - "23 1 20 61728620 True 0 \n", - "24 1 20 61728620 True 0 \n", - "25 1 20 61728620 True 0 \n", - "26 1 20 61728620 True 0 \n", - "27 1 20 61728620 True 0 \n", - "28 1 20 61728620 True 0 \n", - "29 1 20 61728620 True 0 \n", + " n_files n_columns_read n_events \\\n", + "column_setup file_location \n", + "100pct depot 1.0 1249.0 3.854952e+09 \n", + " eos_fuse 1.0 1249.0 3.854952e+09 \n", + " work 1.0 1249.0 3.854952e+09 \n", + " xcache 1.0 1249.0 3.854952e+09 \n", + " xrootd 1.0 1249.0 3.854952e+09 \n", + "10pct depot 1.0 50.0 1.543216e+08 \n", + " eos_fuse 1.0 50.0 1.543216e+08 \n", + " work 1.0 50.0 1.543216e+08 \n", + " xcache 1.0 50.0 1.543216e+08 \n", + " xrootd 1.0 50.0 1.543216e+08 \n", + "50pct depot 1.0 233.0 7.191384e+08 \n", + " eos_fuse 1.0 233.0 7.191384e+08 \n", + " work 1.0 233.0 7.191384e+08 \n", + " xcache 1.0 233.0 7.191384e+08 \n", + " xrootd 1.0 233.0 7.191384e+08 \n", + "5pct depot 1.0 20.0 6.172862e+07 \n", + " eos_fuse 1.0 20.0 6.172862e+07 \n", + " work 1.0 20.0 6.172862e+07 \n", + " xcache 1.0 20.0 6.172862e+07 \n", + " xrootd 1.0 20.0 6.172862e+07 \n", + "\n", + " loaded_columns worker_operation_time n_workers \\\n", + "column_setup file_location \n", + "100pct depot 1.0 0.0 1.0 \n", + " eos_fuse 1.0 0.0 1.0 \n", + " work 1.0 0.0 1.0 \n", + " xcache 1.0 0.0 1.0 \n", + " xrootd 1.0 0.0 1.0 \n", + "10pct depot 1.0 0.0 1.0 \n", + " eos_fuse 1.0 0.0 1.0 \n", + " work 1.0 0.0 1.0 \n", + " xcache 1.0 0.0 1.0 \n", + " xrootd 1.0 0.0 1.0 \n", + "50pct depot 1.0 0.0 1.0 \n", + " eos_fuse 1.0 0.0 1.0 \n", + " work 1.0 0.0 1.0 \n", + " xcache 1.0 0.0 1.0 \n", + " xrootd 1.0 0.0 1.0 \n", + "5pct depot 1.0 0.0 1.0 \n", + " eos_fuse 1.0 0.0 1.0 \n", + " work 1.0 0.0 1.0 \n", + " xcache 1.0 0.0 1.0 \n", + " xrootd 1.0 0.0 1.0 \n", "\n", - " executor n_workers compressed_bytes uncompressed_bytes \\\n", - "0 sequential 1 265594188 1129031467 \n", - "1 sequential 1 265594188 1129031467 \n", - "2 sequential 1 265594188 1129031467 \n", - "3 sequential 1 265594188 1129031467 \n", - "4 sequential 1 265594188 1129031467 \n", - "5 sequential 1 265594188 1129031467 \n", - "6 sequential 1 265594188 1129031467 \n", - "7 sequential 1 265594188 1129031467 \n", - "8 sequential 1 265594188 1129031467 \n", - "9 sequential 1 265594188 1129031467 \n", - "10 sequential 1 265594188 1129031467 \n", - "11 sequential 1 265594188 1129031467 \n", - "12 sequential 1 265594188 1129031467 \n", - "13 sequential 1 265594188 1129031467 \n", - "14 sequential 1 265594188 1129031467 \n", - "15 sequential 1 175488912 521753090 \n", - "16 sequential 1 175488912 521753090 \n", - "17 sequential 1 175488912 521753090 \n", - "18 sequential 1 175488912 521753090 \n", - "19 sequential 1 175488912 521753090 \n", - "20 sequential 1 175488912 521753090 \n", - "21 sequential 1 175488912 521753090 \n", - "22 sequential 1 175488912 521753090 \n", - "23 sequential 1 175488912 521753090 \n", - "24 sequential 1 175488912 521753090 \n", - "25 sequential 1 175488912 521753090 \n", - "26 sequential 1 175488912 521753090 \n", - "27 sequential 1 175488912 521753090 \n", - "28 sequential 1 175488912 521753090 \n", - "29 sequential 1 175488912 521753090 \n", + " compressed_bytes uncompressed_bytes \\\n", + "column_setup file_location \n", + "100pct depot 2.048078e+09 1.156831e+10 \n", + " eos_fuse 2.048078e+09 1.156831e+10 \n", + " work 2.048078e+09 1.156831e+10 \n", + " xcache 2.048078e+09 1.156831e+10 \n", + " xrootd 2.048078e+09 1.156831e+10 \n", + "10pct depot 2.655942e+08 1.129031e+09 \n", + " eos_fuse 2.655942e+08 1.129031e+09 \n", + " work 2.655942e+08 1.129031e+09 \n", + " xcache 2.655942e+08 1.129031e+09 \n", + " xrootd 2.655942e+08 1.129031e+09 \n", + "50pct depot 1.152109e+09 5.636058e+09 \n", + " eos_fuse 1.152109e+09 5.636058e+09 \n", + " work 1.152109e+09 5.636058e+09 \n", + " xcache 1.152109e+09 5.636058e+09 \n", + " xrootd 1.152109e+09 5.636058e+09 \n", + "5pct depot 1.754889e+08 5.217531e+08 \n", + " eos_fuse 1.754889e+08 5.217531e+08 \n", + " work 1.754889e+08 5.217531e+08 \n", + " xcache 1.754889e+08 5.217531e+08 \n", + " xrootd 1.754889e+08 5.217531e+08 \n", "\n", - " time:run_processor time:wait time:decompress column_setup file_location \n", - "0 30.459931 0.030563 24.061388 10pct depot \n", - "1 30.506349 0.031068 24.128228 10pct depot \n", - "2 30.462117 0.030792 24.097522 10pct depot \n", - "3 30.513377 0.030538 24.048350 10pct eos_fuse \n", - "4 30.442081 0.030833 24.080730 10pct eos_fuse \n", - "5 30.533058 0.030703 24.076658 10pct eos_fuse \n", - "6 34.893134 0.030747 24.201373 10pct work \n", - "7 30.539464 0.030596 24.140102 10pct work \n", - "8 30.569113 0.030507 24.164185 10pct work \n", - "9 32.927919 0.320015 24.198597 10pct xcache \n", - "10 33.032840 0.316362 24.168849 10pct xcache \n", - "11 33.051579 0.582236 24.132116 10pct xcache \n", - "12 104.772271 72.213381 24.164070 10pct xrootd \n", - "13 62.811575 30.291163 24.132109 10pct xrootd \n", - "14 55.180227 23.014281 24.131685 10pct xrootd \n", - "15 16.648896 0.010548 13.257322 5pct depot \n", - "16 16.239849 0.010682 13.230332 5pct depot \n", - "17 16.274737 0.010654 13.235920 5pct depot \n", - "18 16.194398 0.010595 13.220522 5pct eos_fuse \n", - "19 16.217556 0.010699 13.240024 5pct eos_fuse \n", - "20 16.141498 0.010582 13.236267 5pct eos_fuse \n", - "21 16.205629 0.010780 13.284610 5pct work \n", - "22 16.178897 0.010704 13.267368 5pct work \n", - "23 16.341841 0.010818 13.327347 5pct work \n", - "24 17.073631 0.226744 13.267385 5pct xcache \n", - "25 17.148725 0.201830 13.262659 5pct xcache \n", - "26 17.189337 0.216665 13.282749 5pct xcache \n", - "27 69.026720 52.127257 13.272705 5pct xrootd \n", - "28 60.013889 43.198484 13.259263 5pct xrootd \n", - "29 72.999483 56.162329 13.268113 5pct xrootd " + " time:run_processor time:wait time:decompress \n", + "column_setup file_location \n", + "100pct depot 243.654209 0.493106 162.890514 \n", + " eos_fuse 244.384049 0.492532 163.389472 \n", + " work 244.729598 0.492726 163.492540 \n", + " xcache 295.894626 7.241993 162.952794 \n", + " xrootd 396.859249 112.672174 162.690041 \n", + "10pct depot 30.986281 0.031470 24.177480 \n", + " eos_fuse 30.993736 0.031423 24.189793 \n", + " work 31.172322 0.031592 24.304306 \n", + " xcache 34.431347 0.419064 24.220722 \n", + " xrootd 57.055680 23.075961 24.225699 \n", + "50pct depot 122.084759 0.146129 94.383458 \n", + " eos_fuse 125.864371 0.146316 95.105503 \n", + " work 122.469830 0.146117 94.683736 \n", + " xcache 144.009001 7.865974 94.551497 \n", + " xrootd 195.641338 60.471580 94.515743 \n", + "5pct depot 16.724332 0.010987 13.306242 \n", + " eos_fuse 16.593939 0.010985 13.306679 \n", + " work 17.331604 0.011054 13.388079 \n", + " xcache 17.703281 0.203441 13.307491 \n", + " xrootd 60.456925 42.946026 13.315967 " ] }, - "execution_count": 8, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "report.sort_values(by=['column_setup', 'file_location']).reset_index(drop=True)" + "report.groupby(['column_setup', 'file_location']).agg('mean')" ] }, { "cell_type": "code", - "execution_count": 38, - "id": "c0a788da-d160-4c81-95ea-150ef4d9a85e", + "execution_count": 30, + "id": "5150e7dc-b728-43f8-b3a0-6b9843e33e97", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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rlw5+Pr64sSJE5gzZw4++OADAI8OX40cORLBwcGoUqUKqlSpguDgYNjZ2aFHjx4Grp6IiIiMgVGHnYULF+Lzzz/H4MGDER8fDw8PDwwcOBCTJk1Slhk/fjxSU1MxePBgJCQkoHHjxggNDYWDg4MBKyciIiJjoRERMXQRhpaUlAQnJyckJibC0dHR0OUQEREZXEpGFnwm7QIAnJvaBnZWxtc/kt+/30Y9ZoeIiIjoRTHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaox7BAREZGqMewQERGRqjHsEBERkaoZ340uiIiI6IV1WLgfd5PTC7y+9rFbZ/rPCoeZRvNC9ZRysMaWYa++0GsUFMMOET23+KQ0xD/HTtTVwRqujjaFWBER/dfd5HTEJaXp5bWep70bI4YdInpuq4/cxPywy/lefkTLKhgV4F2IFRHRk5hpAFeH5/+yoRVRQo6rg3WBe3bik9OglWcvV5gYdojoufVsXA4BPm7K87TMbHRZcggAsGGQH2wszXWWd3WwLtL6iOhfrg42OPxpy+deLyUjCz6TdgEAwsf5w86qYJHhleAwvfUwFRTDDhE9N1dHG53DUikZWcrPPh6OBd4pEhEVBp6NRURERKrGsENERESqxrBDREREqsawQ0RERKrGsENERESqxrBDREREqsawQ0RERKrGsENERESqxrBDREREqsawQ0RERKrGsENERESqxrBDREREqsawQ0RERKrGsENERESqxrBDREREqsawQ0RERKrGsENERESqxrBDREREqmZh6AKIyPA6LNyPu8npBV5fK6L87D8rHGYazQvVU8rBGluGvfpCr0FElINhh4hwNzkdcUlpenmt+BcITUREhYFhh4gUZhrA1cHmudfTiighx9XBusA9O/HJadDKs5cjInoeDDtEpHB1sMHhT1s+93opGVnwmbQLABA+zh92VgXbtbwSHKa3HiYiohwcoExERESqxrBDREREqsbDWERERGqWdBsIcnr+9cQawIpHP0/3ADQFPPkgbSEAl4Ktqyfs2SEiIiJVY9ghIiIiVWPYISIiIlVj2CEiIiJVY9ghIiIiVWPYISIiIlXjqedE9C+eokpEKsSeHSIiIlI1hh0iIiJSNYYdIiIiUrUCj9mJiYnB9evXkZKSglKlSsHX1xfW1tb6rI2IiIjohT1X2Llx4waWLFmCtWvXIiYmBiKizLOyssJrr72GAQMGoHPnzjAzY6cRERERGV6+E8mIESNQs2ZNXL58GVOnTsXZs2eRmJiIjIwMxMXFYfv27Xj11Vfx+eefo1atWoiMjCzMuomIiIjyJd89O1ZWVrh69SpKlSqVa56rqytef/11vP7665g8eTK2b9+OGzduoGHDhnotloiIiOh55TvszJo1K98v2r59+wIVQ0RERKRvBRpYk5qaipSUFOX5jRs3MG/ePOzatUtvhRERERHpQ4HCTseOHfHDDz8AAO7fv4/GjRtj9uzZ6NSpExYvXqzXAm/fvo333nsPLi4usLOzQ506dRAVFaXMFxEEBQXBw8MDtra28Pf3x9mzZ/VaAxHpihdnnNF6KY9z2vLKvHPa8jrzzmi9EC/OhiuWiF56BTr1/Pjx45g7dy4AYMOGDXBzc8OJEyewceNGTJo0CR999JFeiktISEDTpk3RokUL7NixA66urrh69SqcnZ2VZWbOnIk5c+Zg5cqV8Pb2xrRp0xAQEICLFy/CwcFBL3UQka7VWS0xP7tznvO6ZAblmjbCfCNGWW4s5KqIiPJWoLCTkpKiBInQ0FAEBgbCzMwMr7zyCm7cuKG34r788kt4enpixYoVyjQvLy/lZxHBvHnzMHHiRAQGBgIAQkJC4ObmhjVr1mDgwIF5vm56ejrS0/+9d09SUpLeaiZ6GfS0CEOAedSzF/x/rpr7hVcMEdEzFOgwVuXKlfHLL78gJiYGu3btQuvWrQEA8fHxcHR01Ftxv/32Gxo0aICuXbvC1dUVdevWxfLly5X50dHRiIuLU7YPANbW1mjevDkOHjz4xNedMWMGnJyclIenp6feaiZ6Gbhq7qOG2fV8Pxh2iMiQChR2Jk2ahLFjx8LLywuNGzeGn58fgEe9PHXr1tVbcdeuXcPixYtRpUoV7Nq1C4MGDcLw4cOV8UJxcXEAADc3N5313NzclHl5mTBhAhITE5VHTEyM3momIiIi41Kgw1hdunTBq6++itjYWNSuXVuZ3rJlS7z99tt6K06r1aJBgwYIDg4GANStWxdnz57F4sWL0atXL2U5jUajs56I5Jr2OGtra97agoiI6CVR4Hs6uLu7o27dujq3hWjUqBGqVauml8IAoHTp0vDx8dGZVr16ddy8eVOpAUCuXpz4+PhcvT1ERET0csp32Bk0aFC+D/f89NNPWL16dYGLytG0aVNcvHhRZ9qlS5dQvvyj01wrVKgAd3d37N69W5mfkZGBiIgINGnS5IW3T0RERKYv34exSpUqhRo1aqBJkyZ466230KBBA3h4eMDGxgYJCQk4d+4c9u/fj3Xr1qFMmTJYtmzZCxc3atQoNGnSBMHBwejWrRuOHj2KZcuWKa+t0WgwcuRIBAcHo0qVKqhSpQqCg4NhZ2eHHj16vPD2iYiIyPTlO+z873//w7Bhw/Ddd99hyZIlOHPmjM58BwcHtGrVCt9++63O2VEvomHDhti8eTMmTJiAqVOnokKFCpg3bx569uypLDN+/HikpqZi8ODBSEhIQOPGjREaGspr7BARERGA5xyg7OrqigkTJmDChAm4f/8+bty4gdTUVJQsWRKVKlV66qDggnrzzTfx5ptvPnG+RqNBUFAQgoKC9L5tIiIiMn0FOhsLAJydnXWuZExERERkjAp8NhYRERGRKWDYISIiIlVj2CEiIiJVY9ghIiIiVStw2MnKysLvv/+OpUuXIjk5GQBw584dPHjwQG/FEREREb2oAp2NdePGDbRt2xY3b95Eeno6AgIC4ODggJkzZyItLQ1LlizRd51EREREBVKgnp0RI0agQYMGSEhIgK2trTL97bffRlhYmN6KIyIiInpRBerZ2b9/Pw4cOAArKyud6eXLl8ft27f1UhgRERGRPhSoZ0er1SI7OzvX9Fu3bvE2DURERGRUChR2AgICMG/ePOW5RqPBgwcPMHnyZLRv315ftRERERG9sAIdxpo7dy5atGgBHx8fpKWloUePHrh8+TJKliyJtWvX6rtGIiIiogIrUNjx8PDAyZMnsXbtWhw/fhxarRb9+vVDz549dQYsExERERlagW8Eamtriw8++AAffPCBPushIiIi0qsCh53bt2/jwIEDiI+Ph1ar1Zk3fPjwFy6MiIiISB8KFHZWrFiBQYMGwcrKCi4uLtBoNMo8jUbDsENERERGo0BhZ9KkSZg0aRImTJgAMzPeXouIiIiMV4GSSkpKCt59910GHSIiIjJ6BUor/fr1w88//6zvWoiIiIj0rkCHsWbMmIE333wTO3fuRM2aNWFpaakzf86cOXopjoiIiOhFFSjsBAcHY9euXahatSoA5BqgTERERGQsChR25syZg++//x59+vTRczlERERE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/v37K/Nv3LhhqNIkKytLRES++OILpcYc+/fvl4CAAPH29paIiAhDlGc02Lb1g2276JhS22bYMSGP7wwPHDggP//8s5w4cUL5Zb906ZKUKFFC3njjDTlz5oxotVrp2LGjfPXVV4YqOZe8duirV6+Wdu3aya+//ir29vayaNEiZd727dtl+PDhcuvWLb3WkfMH47fffpOFCxfK7du3pUaNGlKvXj2pU6eO2NnZSZMmTcTLy0t8fHykYcOG0rRpU3n48KFe69CXn376SSpXrizR0dFSoUIF+fDDD5XP+vfff5e+ffsWyQ49Z5uP/0FOTU0VEZGFCxdK+fLl5c6dOzrrhISEiEajETc3N9m5c2eh12iM2Lb1h227cJh622bYMUHjxo0TT09P8fDwkAoVKoifn5/s379fRB7tFN3c3KR27dpSo0YN8fHxkYyMDANX/MjjO8P169fL6dOnRUQkLi5OSpQoIRqNRr799ltlmdTUVGnXrp289957hfJt9tixY1KyZElZuXKliDz6Bt28eXPRaDQyc+ZM2bJli6xatUrWrFkjGzdulIsXL+q9hueVlZWV52eRkJAgTZo0EQsLC+ndu7eI/LtT+vjjj+X111+Xe/fuFUmNV65ckdDQUBF59P/82muvSXp6uvz+++9SuXJlWb58uSQlJSnLHz58WPz9/WXkyJFy9erVIqnRWLFt6wfbduEw5bbNsGNivv32W3FxcZG9e/fKP//8I9u2bZNu3bpJpUqV5PDhwyIicvPmTQkODpYvv/xS6SLWd1fx83q8EX/yySfi5eUl06dPl/v374uIyLZt26R48eLSo0cP2bJli/z6668SEBAgNWvWVGrX507x0qVLMmvWLBk/fryI/NsdGxsbK/Xr15dGjRrl+pZiSPHx8TrPDx8+LN98842sX79e/vnnHxER+frrr8XHx0d69Ogh8fHxcuzYMfn444/FyclJTp06VWS19ujRQywsLOTTTz8Vc3NzWbFihTJvyJAh4ubmJkuWLJFr165JZmamTJgwQXr06CEJCQlFVqMxYtvWD7btwmPKbZthx4RotVoZPHiw9O3bV2d6VFSUvPHGG9KrV688u2INvTN83P/+9z9xcXGRo0ePKl2gOcLDw8XX11e8vLykUaNG0qVLF+Wba84O60VptVr5+++/xdPTU6ytraVPnz7KvJxvp3FxcVK/fn0pW7asXL9+XS/bfRELFy6UwMBAOXnypIiIbNmyRSwtLaVx48ai0WikS5cucvToUcnKypKvv/5a6tatK1ZWVuLr6yt16tSREydOFHnNDRs2FHNzcxk9enSuecOHD5fq1auLq6ur1K9fX+zs7OTPP/8s8hqNCdv2i2PbLhqm2rYZdkzMsGHDpGnTppKWlqYzfcaMGVKhQgWdLkRjc/fuXQkICJB169aJyKNvqbt375bu3bvL3LlzJS0tTR4+fCg3b96U+Ph45duevnboj3973LNnj1SuXFlq164tBw8eVKY/PrDxtddeM3jXq8ijsQceHh7Sp08f2b9/v3Tu3FmWL18uIo8GL9apU0fefPNNOXLkiIg8+rx2794tV65cyfWtsbClpqZKZmam1KlTR2rWrClubm6ybdu2XIdbDhw4ICEhIbJkyRK5cuVKkdZorNi2C45tu/CZettm2DFSTzoz49tvv5XKlSvLL7/8ovPtafv27VKvXj2JjY0tqhKf6b/v4eHDh1K1alXp37+/7N27VwIDA6VRo0bStm1bMTMzk6lTp+Z6DX10b+e8Rs43yJy6/vjjD/Hy8pIePXrofEPKma+vb5wvIqf20NBQKVeunPTr10/eeOMNnW+lR48elXr16kmHDh3kjz/+MFSpOnJ2gO3bt5dSpUrl2ika62DQosC2/QjbNtt2UWLYMUKP70h27Nghv/32m2zbtk2Z1rlzZ6lcubL88MMPcu3aNfnrr78kICBA2rVrZ5SnpW7evFkZc7Bq1Srx8vKSYsWKyccffyy///67iIiMGDFCunfv/sQ/BAWV83n8/vvvMmTIEOnZs6dMnz5dOXshNDRUvLy8pGfPnkpXsjF5/PPYsmWLlC1bVqytrWX37t06y0VGRkrjxo2lRYsWsnfv3iKtMecz/vPPP2X9+vXy22+/yfHjx5X57du3Fzc3N9m6daukpaXJtGnTpEWLFpKZman3/29jx7atP2zbhU9NbZthx8g8vkMbNWqUODk5ScWKFcXGxkbatGkj58+fFxGRnj17So0aNcTOzk7q1KkjdevWVdK1Mf2SnT17VmrUqCFdunSRM2fOiIjI33//LZcuXVKW0Wq10qJFC/n4448LpYbNmzeLjY2N9O/fXwICAqRBgwZSvnx55bTe0NBQqVKlirz11ltFOtjvWXJ+F86dOycPHjwQkUdd9J6envLuu+/mOhZ+6NAh8ff3l5iYmCKvdcOGDVK8eHGpV6+eFC9eXGrXri3Tp09X5r/11ltSokQJadKkiTg5OcnRo0eLvEZDY9vWP7btwqeWts2wY0Qe3xlevnxZfH195dixY3Lnzh05f/68VKtWTZo2bar8wkdFRcmmTZtkx44dSresoQcs5vXtc/Xq1dK8eXN55513JDIyUpmenJwsERER0r59e6lVq1ah1B4fHy+1a9eWmTNnKtNOnz4tAQEBUqFCBeW4986dO6V27dpy+/ZtvddQEDmf4+bNm6VSpUryySefSHp6uoiI7Nq1S8qVKye9e/fOtQP/73iPonDq1ClxcXGRRYsWSUpKipw5c0YmTZoknp6eMmPGDGW5JUuWyPz5843iNN+ixrbNtp2DbdswGHaM0FdffSVdu3aVXr16SXZ2ts6ZBJ6envLee+/luZ4hj0Nv3rxZEhMTlec5p53mWLt2rbz66qvyzjvvKF3Ku3btkm7duknbtm31fmaGyKM/DgkJCVKqVCnl2hA52zhx4oTUq1dPFi5cqHy+xnasefv27WJjYyPLly/PtRPZuXOncpz/8W5lQxzqWL9+vdSsWVOSk5OVaXfu3JFPP/1UGjZsqPNN/2XHtq0fbNtFQ01tm2HHyCQnJ8uYMWPE3t5emjRpokzPGbC4fv16cXNzkxs3bhhNl3bDhg3F399fqWfZsmXSt2/fXGc7rFmzRqpVqyZdu3ZVGsnJkyeV9fT57e/YsWMyaNAg+euvv6Rx48by6aef6szXarXSqFEjGTp0qM40Y5Geni7vvvuujBkzRmf64wMBd+7cKfb29jJ48GDlm6Eh7NixQ9zc3HKNi4iMjBQ7OzsJDw83UGXGhW1bP9i2i46a2jZvBGpgWq1W57m9vT2GDx+OMWPG4NChQ1iwYAEAwMbGBgBgbm4OJycnWFtbK3ebNaStW7fiwYMH+PXXX2FmZoaUlBSYmZkhMjISCxcuxLVr15Rlu3fvjrfffhu7du3CkCFDcPnyZdSuXRtmZmbQarV6vTHgoUOHsH//fly7dg1NmzbF7t27sWnTJmW+RqNBmTJl4OzsDHkU+pU7IxuDzMxMHD9+HA4ODso0EYGlpSWARzeKbNOmDTZu3IiRI0fCysrKUKWiTJkycHJyws8//4y7d+8q0ytUqIAqVaoU6t2tjRnbNtt2Xti2DaPwbjtLz6TVapWd2sWLF/H333+jWrVqKFOmDD755BOkpaVh9OjRyMjIQGBgIMzNzbFs2TKULl0apUqVMnD1jzg6OuLChQs4f/481q5di/379+PYsWN48OABQkJCoNVqMXz4cFSqVAkAULZsWdSrVw+1a9dWpgF44Z17zg4tJSUFdnZ2GDp0KH7++WdMnz4dmzdvRteuXfHFF19g3759aNKkCfbu3YuwsDAEBwcbzY7w8Z2ypaUlfH19cfv2bSQnJ8PBwUGZd/LkSfz444+YOnUqWrduXeT1nTx5Ejdv3sT9+/fx1ltvoWbNmvj4448xYsQIaLVadOjQAZUrV8bs2bNx9+5dVKtWrchqNBZs22zbj2PbNgKG6VB6uWm1Wp1u1U8//VSqV68u7u7u0qBBA6WL9u+//5YJEyaIubm5ODg4yLBhw6R169ZKt7ehu7pz3sPYsWPFyspKihcvrnMH3rlz50q9evVk8ODBEhkZKenp6dK5c2f57rvvlHX1+R527Ngh3bt3V244d+vWLSlXrpwsXLhQUlNTZcKECfLKK69IlSpV5LXXXjPI1Ufz8qQu9unTp4uTk5OEhITojJn4/PPPpXbt2hIXF1dUJSp+/vlnKVmypFSrVk3c3NzE3d1duZDcd999JzVq1BBnZ2fx9fWVsmXL6ow5eBmwbbNtP45t23gw7BhITiP46quvxNXVVcLCwkRE5L333pOSJUvKgQMHROTR/VyCgoKkePHi8uWXXyrrG2Jk/pN88sknotFoxMLCQrnmRo5vvvlGmjVrJo6OjuLj4yM+Pj6Fcj8crVYrH374oWg0GilevLhMmjRJrl69KtOnT5eOHTvKhQsXROTRDjg+Pl453dPQcj6D/fv3y8SJE2XixImyatUqZf6AAQPE3d1devToIcOGDZMePXqIo6OjQa4bcuLECXFxcZGQkBD566+/JC0tTXr37i2lS5eWjRs3isij+xIdOHBAdu/ebTRnvxQ1tm22bRG2bWPDsFOEJk6cKAsWLFCeP3z4UDp06CCLFi0SkUcj9B0cHGTp0qUi8mggW2ZmpsTFxclnn30mDg4OOncONjStVitpaWnyzTffyN69e+Wjjz4SCwsLZeee4/jx47Ju3TpZtmyZckaGPs7M+O8O9ciRI9K9e3eZNm2aNGrUSD766CPp37+/VK9eXWbNmvXC2yssGzdulOLFi0vnzp3lrbfekmrVqsnYsWOV+fPnz5cBAwbIK6+8Iv3791euaVLY/vv5btiwQXx9fSU+Pl7nW3vPnj2lbNmyRnfGS1Fi22bbzgvbtvFg2CkiCQkJ4u/vL82aNZPvv/9eme7n5yenTp2SXbt2ib29vSxZskREHu0Mly9frlwx886dOzJp0iTRaDQ6d5o1Jrdu3ZJ+/fqJhYXFUy9trs9TUMPCwpQ/EtnZ2TJ06FDp06ePJCYmypIlS5RvhBqNRuc+Ocbi8OHD4unpqfy/51zXwsLCQvr166ezbEZGRpGegpyzQ9yxY4c8fPhQ1q1bJyVKlFC+vefsAO/duyclS5aUX3/9tchqMyZs2/9i2/4X27ZxYdgpAjm/WH/99Zd06dJFXn/9deVmb+3bt5dq1aqJk5OTfPfdd8o6t2/fltdff13n296tW7dk2rRpSretsXj8W8Lt27elX79+YmlpqewUC2v8QVZWlkyfPl00Go306tVL9u/fL1qtVurWrSuTJ08WEZGkpCQZNmyYeHh4GNU1IXI+s8WLF8tHH30kIiI3btyQChUqSJ8+fWTu3LliaWkp48ePN2SZsm/fPtFoNLJ+/Xq5f/++VKhQQXr16qXM12q1cv36dalSpYpJnYaqL2zbbNv/xbZtnBh2isDjif3gwYPSvHlzadCggWzcuFGOHz8u9erVk1q1aonIo+P1CQkJ0q5dO3n11VdzpX1juIHds9y5c0f51hUVFVXo2/vzzz+ldevW0rRpUxkxYoTs2LFDOnToIPv27VOWSUhIKPQ68iNnR5gzEDU9PV0OHTokGRkZ0rJlS+nTp4+IPLprdNmyZUWj0ciwYcMMUuuFCxdk+fLlMmfOHBF59Lu3cuVK8fX1lffee08SExPl+vXrEhQUJOXKlTPIpewNjW27cLFtF46XsW0z7BSh0aNHS8eOHaVRo0bi4OAg1apVk6+//lpWr14tnp6e4u3tLU2aNJEmTZro3A/HFHaC/xUTEyMzZswoskvcx8XFyapVq6ROnTpib28vFSpUkE8++aRItp1fOTvDsLAw+eyzz+Ts2bPKvKtXr0rt2rWVQaBxcXHSvXt3+f777+XKlStFXuvVq1elTp06UqJECWXcicijq+euWrVKKleuLE5OTlK1alXx9PQskj98xoxtu/CwbevXy9q2GXaKSEhIiDg7O8uxY8fk3r17cvv2bWnVqpU0b95cvv/+e4mJiZHg4GCZMmWKfPvtt0ZzPxx9dFMX5XvIysqS0aNHi42Njbi6ukpSUlKRbTs/Nm7cKHZ2djJlyhSdewldv35dihcvLlOnTpW0tDSZMGGCNG3aVO7du1fkNUZFRcnhw4dl4sSJ4urqmusWBtnZ2ZKamiq//PKLREREqOJb34tg2y4abNsv7mVu2ww7RWTSpEni5+cn2dnZyreAmJgYadiwoVSuXFk2bNiQax1Df+t7fGc4d+5cmTVrVr52kI/XXZTXC3l8fEFYWJhcv369yLadH2fPnhVPT09ZvHixznStViupqakybdo0cXR0lEqVKknJkiUNch2LxMREsbOzk02bNsnDhw/lf//7n5QtW1YmTJigLPP4Ze2JbbsosG2/uJe9bfMKyoVM/v/KlLa2tkhPT0daWhrs7OyQmZmJsmXLYsaMGejYsSMmT54MCwsLdOzYUVnH3NzcoLXnXPl0/PjxWLNmDYYNG4a//voLpUuXfuI6IqLUvXr1ajg7O6N9+/ZFciVTjUajfHavv/56oW/veV29ehWOjo54++23lWk5V9q1sbHBqFGjEBAQgGvXrsHPzw/ly5cv8hptbW1Ro0YN/PPPP7Czs0P//v0hIli7di3MzMwwbdo0WFpaIjs72+C/n4bGts22nYNt2wQYKmW9bM6cOSMWFhYyZcoUnenbtm2Tt956Sz799FODXzU1L8uXL5dSpUrpXJE0KytLsrKycl2r4fHnS5cuFY1GI9u3by+qUo3W4cOHJTY2VlavXi3ly5eX2NhYEdH9vP744w+DnInz30GVIiJ9+/aVd999V3l+69YtmTp1qvj6+sqIESOKukSjx7b98mLbNh2Gv9vcS8LX1xfLly/HtGnTMG7cOBw9ehRXrlzBN998Ax8fH0yfPl25aZ6xEBFcunQJ3bp1Q506dXD+/HksW7YM9erVQ4sWLfDjjz8iOztbWTbnG97SpUsxbtw4bNiwAe3atTPkWzC4pKQktGrVCvv27UOjRo1w69YtrF27FgB0vhH/8ssv2Lx5M7KysiAiRVafRqPBzp070bZtW7z55pv48ssvER0dDY1Gg9TUVKSnp6NMmTL47LPP0KFDB0RFRencEJDYtl9WbNumhYexilDv3r1hb2+PIUOGYO3atdBoNChVqhR++eUXAI92Koa823HOTi3n35zu9qVLl6JixYr48ccf4enpicDAQERFRWHmzJno1KmTzo3sli5divHjx+P7779HYGCgwd6LsbC1tYWPjw8SExNRuXJlTJ8+HePHj0dWVhbefvttmJubY8mSJfjxxx9x6NAhvd4dOr/s7OzQvn17nDhxAseOHcOVK1cQERGBv//+G7du3ULz5s1RpkwZNGjQAGPGjEHJkiWLvEZjx7b98mHbNjGG6VB6ud2+fVsiIyNlz549Rnlmxn8HqfXv319q1aols2fPVi5nfujQIWncuLHcuXNHWW7OnDni4uKS54DMl8Wzuo5TUlJkwYIFYmtrKx4eHuLt7S2VKlUyqpvqhYWFibOzs8yePVumTJkiffv2FV9fX7l27ZqhSzN6bNvqxbZt2jQiRdivRnky9ICwnIF0ALBgwQJERERARFCpUiXMmjULAJCcnAwHBwcAQFZWFt58801YW1vjl19+UbpFX3nlFYwfPx49e/Y02HsxBjt37sQXX3wBe3t7vPbaa9i5cyfc3d2xYsUKmJmZwcrKCvfv38fx48dhaWmJSpUqwcPDw6A1y/9/48/KysLNmzfRvn17bNiwATVq1ABg+N9RU2Xoz41tW7/Ytk0XD2MZAUP/ouXsDCdMmIBvv/0W/fv3x927d7Fu3TqEhYVh586dcHV1RVJSEn755Rf8+OOPiI+PR2RkpNKIbG1tcfToUVhbWxv0vRiDJ3Ud//PPP0rXcYkSJfDWW2+hUaNGhi4XwL9jDCwsLFCxYkWYmZlh7969qFGjhsEPwZgytm11Yds2XQw7BAA4d+4cfvrpJ/z4449o06YNAODatWsIDAxEp06dcPDgQTx8+BAxMTHw8PDA9u3bYWFhgaysLOVYNHeGjzRr1gzNmjVTnv/xxx/o3Lkz2rRpgwcPHuDGjRv47bff0KdPH8MV+QQ53wLt7e1x584dACiSU4up8LBt6w/btuli2CEAQEJCAu7fv4/q1asDeNQwKlasiJUrV+KNN97Azz//jK5du2L48OGwt7eHRqNBdna2QQbdmYLHu469vLzg5uaG1q1bG33Xcc7Or0+fPjo7dTJdbNv6xbZtml6O/ivSkdcpsD4+PihRogTWr18P4N+G4enpCVtbW9y7dw8AlLMz5LELjFFuT+o6Bgx/Zk5+fPTRR8rOm0wH23bhY9s2TYzuL5nHByyuXLkSFy5cwIMHD9C4cWO0bNkS+/fvR9myZfHuu+8CeHSM2tnZGVZWVjqv8zJ1f74IU+06NoUaSRfbdtFi2zYtPBvrJTV+/Hj88MMP6NmzJ27evIno6Gi4uLjA1tYWt27dQt26dVG/fn2sX78e9+7dw4kTJ/ht7wUsWrQIzZo1eym/UVHRYtsuWmzbpoFh5yUUGhqKjz76CGvXrkWjRo2wfv16vPfee/jtt9/g6+uLn376CT/99BPs7OxQunRprFq1St33TCkC8thVaIkKC9t20WPbNg08jPUSunPnDsqVK4dGjRphw4YN6N+/P+bPn4+2bdtCRNC0aVOMGTMGGRkZylkYj5+ZQc+PO0MqCmzbRY9t2zQY90gq0qucTrz09HS4u7tjx44d6Nu3L2bOnImPPvoIAPDbb79h06ZNuHfvnrIzFBHuDImMGNs20dPxMNZL6Ny5c6hTpw6ysrLw/fffK9eESE1NRWBgIDw8PPDtt9/yGwuRiWHbJsobe3ZeQj4+Pvjuu+9gY2OD8+fPIzw8HHv27EHHjh1x584dLF26VDkFlYhMB9s2Ud7Ys/OSysrKwoYNGzB27FgAgLu7Ozw8PLBx40YOWCQyYWzbRLkx7Lzk7t69i/v378PGxgZly5ZVrgzK4/hEpo1tm+hfDDuk4/ELkxGRerBt08uMYYeIiIhUjTGfiIiIVI1hh4iIiFSNYYeIiIhUjWGHiIiIVI1hh4iIiFSNYYeIiIhUjWGHiIiIVI1hh4iIiFSNYYeIiIhUjWGHiIiIVI1hh4iIiFSNYYeIiIhUjWGHiIiIVI1hhwhASkoKOnfuDEdHR2g0Gty/fz/P5ZYtWwZPT0+YmZlh3rx5CAoKQp06dZT5ffr0QadOnYqkZiJ6fnFxcQgICECxYsXg7Oz8xOWCgoLg5uYGjUaDX375JVfb9vf3x8iRIwu9XtIPhh0ymKCgIGg0Gp2Hu7u7zjJfffUV3Nzc4Obmhrlz5+rMO3LkCOrXr4/s7OwXriUkJAT79u3DwYMHERsbCycnp1zLJCUlYejQofj4449x+/ZtDBgwAGPHjkVYWNgLb5/IVO3duxcdOnSAh4eHEgz+S0QQFBQEDw8P2Nrawt/fH2fPntVZZvTo0ShRogTKlSuHdevW6cxbv349OnTooJd6586di9jYWJw8eRKXLl3Kc5nz589jypQpWLp0KWJjY9GuXTvMnz8fK1eu1EsNVPQsDF0Avdx8fX3x+++/K8/Nzc2Vn0+fPo1JkyZh69atEBG8+eabCAgIQI0aNZCZmYlBgwZh2bJlOusU1NWrV1G9enXUqFHjicvcvHkTmZmZeOONN1C6dGllur29/Qtvn8hUPXz4ELVr10bfvn3RuXPnPJeZOXMm5syZg5UrV8Lb2xvTpk1DQEAALl68CAcHB2zZsgVr1qxBaGgoLl++jL59+yIgIAAuLi64f/8+Jk6cqLcvFVevXkX9+vVRpUqVpy4DAB07doRGowEAWFtb62X7ZBjs2SGDsrCwgLu7u/IoVaqUMu/8+fOoVasWXn/9dbRs2RK1atXC+fPnAQCzZs1Cs2bN0LBhw3xtZ+PGjfD19YW1tTW8vLwwe/ZsZZ6/vz9mz56NvXv3QqPRwN/fP9f6K1euRM2aNQEAFStWhEajwfXr13MdxvovEcHMmTNRsWJF2Nraonbt2tiwYUO+aiYyBe3atcO0adMQGBiY53wRwbx58zBx4kQEBgaiRo0aCAkJQUpKCtasWQPgUVv39/dHgwYN0L17dzg6OuLatWsAgPHjx2Pw4MEoV65cvupZvHgxKlWqBCsrK1StWhWrVq1S5nl5eWHjxo344YcfoNFo0KdPn1zrBwUFKb1IZmZmSth51iHqjIwMjB8/HmXKlEGxYsXQuHFjhIeH56tmKnwMO2RQly9fhoeHBypUqIB3331X2cEBQM2aNXHp0iXcvHkTN27cwKVLl1CjRg1cuXIFK1euxLRp0/K1jaioKHTr1g3vvvsuTp8+jaCgIHz++edKl/SmTZvw4Ycfws/PD7Gxsdi0aVOu13jnnXeUHqijR48iNjYWnp6ez9z2Z599hhUrVmDx4sU4e/YsRo0ahffeew8RERH5qp3I1EVHRyMuLg6tW7dWpllbW6N58+Y4ePAgAKB27do4duwYEhISEBUVhdTUVFSuXBn79+/H8ePHMXz48Hxta/PmzRgxYgTGjBmDM2fOYODAgejbty/27NkDAIiMjETbtm3RrVs3xMbGYv78+bleY+zYsVixYgUAIDY2FrGxsfnadt++fXHgwAGsW7cOp06dQteuXdG2bVtcvnw5X+tT4eJhLDKYxo0b44cffoC3tzf++usvTJs2DU2aNMHZs2fh4uKC6tWrIzg4GAEBAQCAGTNmoHr16mjVqhVmzpyJXbt2ISgoCJaWlpg/fz6aNWuW53bmzJmDli1b4vPPPwcAeHt749y5c5g1axb69OmDEiVKwM7ODlZWVrnGDOWwtbWFi4sLAKBUqVJPXO5xDx8+xJw5c/DHH3/Az88PwKNeof3792Pp0qVo3rz5c39mRKYmLi4OAODm5qYz3c3NDTdu3AAAtGnTBu+99x4aNmwIW1tbhISEoFixYvjoo4+wcuVKLF68GAsXLkTJkiWxbNky+Pr65rmtr776Cn369MHgwYMBPBoHdPjwYXz11Vdo0aIFSpUqBWtra9ja2j6xDdvb2ysDl/PTzoFHh73Wrl2LW7duwcPDA8Cj0LRz506sWLECwcHB+XodKjwMO2Qw7dq1U36uWbMm/Pz8UKlSJYSEhGD06NEAgEGDBmHQoEHKcitXroSDgwP8/PxQtWpVREZG4tatW3j33XcRHR2d53H18+fPo2PHjjrTmjZtinnz5iE7O1svY37ycu7cOaSlpSlhLUdGRgbq1q1bKNskMlY5h4NyiIjOtKCgIAQFBek8b9WqFSwtLTFt2jScPn0aW7duRa9evRAVFZXnNs6fP48BAwboTGvatGmePTj6dPz4cYgIvL29daanp6crX5LIsBh2yGgUK1YMNWvWfGK377179zB16lTs3bsXR44cgbe3N6pUqYIqVaogMzMTly5dUsbVPO6/O9WcaYVNq9UCALZt24YyZcrozONgR3pZ5PSOxMXF6Qzsj4+Pz9Xbk+PChQtYvXo1Tpw4ge+//x7NmjVDqVKl0K1bN3zwwQdISkqCo6Njnus+K1QVBq1WC3Nzc0RFReX68sQTGIwDx+yQ0UhPT8f58+d1doiPGzlyJEaNGoWyZcsiOzsbmZmZyrysrKwnnoLu4+OD/fv360w7ePAgvL29C61XJ2e71tbWuHnzJipXrqzzyM94HyI1qFChAtzd3bF7925lWkZGBiIiItCkSZNcy4sIBgwYgNmzZ8Pe3l6nref8m/NF4r+qV6+eZ1uvXr26vt5OnurWrYvs7GzEx8fnauv5PRRGhYs9O2QwY8eORYcOHVCuXDnEx8dj2rRpSEpKQu/evXMtu3v3bly+fBk//PADAKBRo0a4cOECduzYgZiYGJibm6Nq1ap5bmfMmDFo2LAh/ve//+Gdd97BoUOH8PXXX2PRokWF+v4cHBwwduxYjBo1ClqtFq+++iqSkpJw8OBB2Nvb5/k+iUzNgwcPcOXKFeV5dHQ0Tp48qVwzR6PRYOTIkQgODlZ6YoODg2FnZ4cePXrker3ly5fD1dUVb731FoBHh6GCgoJw+PBh7NixAz4+Pk+8GOC4cePQrVs31KtXDy1btsSWLVuwadMmnctbFAZvb2/07NkTvXr1wuzZs1G3bl3cu3cPf/zxB2rWrIn27dsX6vYpH4TIQN555x0pXbq0WFpaioeHhwQGBsrZs2dzLZeSkiLe3t5y4sQJnenLly8XNzc3KVeunGzduvWp29qwYYP4+PiIpaWllCtXTmbNmqUzf8SIEdK8efOnvsaJEycEgERHRyvTJk+eLLVr11ae9+7dWzp27Kg812q1Mn/+fKlatapYWlpKqVKlpE2bNhIREfHUbRGZij179giAXI/evXsry2i1Wpk8ebK4u7uLtbW1NGvWTE6fPp3rteLi4qR8+fJy+/ZtnelTpkyREiVKSLVq1eTIkSNPrWfRokVSsWJFsbS0FG9vb/nhhx905nfs2FGntrxs3rxZ/vvn8b9tu3nz5jJixAjleUZGhkyaNEm8vLzE0tJS3N3d5e2335ZTp049dVtUNDQiRTB4gYiIiMhAOGaHiIiIVI1hh4iIiFSNYYeIiIhUjWGHiIiIVI1hh4iIiFSNYYeIiIhUjWGHiIiIVI1hh4iIiFSNYYeIiIhUjWGHiIiIVI1hh4iIiFTt/wBrBiojwjF+ugAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ - "import matplotlib.pyplot as plt\n", - "\n", - "report[\"MB/s (compressed)\"] = report.compressed_bytes/report['time:run_processor']/(1024*1024)\n", - "report[\"column_setup\"] = report[\"column_setup\"].apply(lambda x: x.replace('pct', '% of the file'))\n", + "report[\"column_setup\"] = report[\"column_setup\"].apply(lambda x: x.replace('pct', '% of data'))\n", "\n", - "measurements = [\"time:run_processor\", \"time:decompress\", \"time:wait\", \"MB/s (compressed)\"]\n", + "measurements = [\"time:run_processor\", \"time:decompress\", \"time:wait\"]\n", "other_cols = [c for c in report.columns if c not in measurements]\n", "\n", "agg = {}\n", @@ -884,13 +944,31 @@ "\n", "aggregated = report.groupby(other_cols).agg(agg)\n", "\n", - "\n", - "# Reset the index to make it easier to plot\n", "aggregated_reset = aggregated.reset_index()\n", - " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "32757e8a-08b4-4396-a2a3-46e9e40bbcb7", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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9+7d8ezZM6xcuRLe3t5wdnbGkCFDkJ6errzP29sb33zzDXr37g17e3t4enpi/vz5Wu1SqVRYtGgROnfujFKlSuHbb78FAGzbtg316tWDjY0NKlWqhAkTJmglZiEhIShfvjysra3h6emJoUOHKst++OEH+Pj4wMbGBm5ubujevbuy7OXuQ3nd9l27dqF69eqwt7dXkkciIiIyXUwKTEyrVq1Qu3ZtbN68WZlnZmaGefPm4fz581i5ciX27duHUaNGAQCaNGmCOXPmwMHBAZGRkYiMjMSIESMAACkpKfjmm29w5swZbNmyBTdu3MCAAQNyrH/AgAG4efMm9u3bh40bN+KHH37QSiREBG+++SaioqKwfft2nDhxAgEBAWjdujUeP34MAPj999/RtWtXvPnmmzh16hT27t2L+vXra9Vx/PhxbN26FX/++SdEBO3bt9c6a5+QkIB58+Zh/fr12LlzJw4cOICuXbti+/bt2L59O1atWoUlS5Zg48aNWu2fPn06atWqhZMnT2LMmDH47LPPEBYWplVm/Pjx6Ny5M86dO4f33nsPu3btwjvvvIOhQ4fi4sWLWLx4MVasWIHvvvsOALBx40bMnj0bixcvxtWrV7Flyxb4+/sDAI4fP46hQ4di4sSJuHLlCnbu3InmzZvn+PnmZdtnzJiBVatW4Y8//kBERITyf0pEREQmSkhiYmIEgMTExGRalpiYKBcvXpTExESt+RerVivSV371799fOnfunOWynj17SvXq1bN974YNG8TFxUWZXr58uTg6OuZa599//y0AJC4uLsvlV65cEQBy9OhRZd6lS5cEgMyePVtERPbu3SsODg6SlJSk9d7KlSvL4sWLRUSkcePG0qdPnyzr+OeffwSAHD58WJn38OFDsbW1lQ0bNijbA0CuXbumlPnoo4/Ezs5Oq+3t2rWTjz76SJmuUKGCvP7661r19ezZU9544w1lGoAEBwdrlXnttddk0qRJWvNWrVolHh4eIiIyc+ZM8fX1lZSUlEzbs2nTJnFwcJDY2Ngst7dFixYybNiwQm37999/L25ublmuvzjK7jtLRERUWM+SU6XC6N+kwujf5FlyqqGbk6ucjnFfxisFJkhEoFKplOn9+/cjKCgIr7zyCtRqNfr164dHjx7h2bNnOa7n1KlT6Ny5MypUqAC1Wo3AwEAAQERERJblL126BAsL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lBk0Kbh//z769u2LyMhIODo6olatWti5cyeCgoIAAKNGjUJiYiIGDx6MJ0+eoGHDhti9ezfUarWyjtmzZ8PCwgI9evRAYmIiWrdujRUrVsDc3NxQm0VEREREhWSmAlzV2l1/CnulIDouCRrRWRNLFIMmBcuWLctxuUqlQkhICEJCQrItY2Njg/nz52P+/Pk6bh0RERERGYqr2gZHv2ytNa+w9xQ0mrRXZ1chShqju6eAiIiIiCgrrg42vHFYTww+JCkRERERERkWkwIiIiIiIhPHpICIiIiIyMQxKSAiIiIiMnFMCoiIiIiITByTAiIiIiIiE8ekgIiIiIjIxDEpICIiIiIycQV6eNnt27dx8+ZNJCQkoGzZsqhZsyasra113TYiIiIiIioCeU4Kbt26hUWLFmHdunW4ffs2RERZZmVlhddeew0ffvghunXrBjMzXoAgIiIiIiou8nT0PmzYMPj7++Pq1auYOHEiLly4gJiYGKSkpCAqKgrbt29Hs2bN8PXXX6NWrVo4duyYvttNREREREQ6kqcrBVZWVrh+/TrKli2baZmrqytatWqFVq1aYfz48di+fTtu3bqFBg0a6LyxRERERESke3lKCqZPn57nFbZv377AjSEiIiIiMpjYu0CIo27XmTQfgItu16kH+e78n5iYiISEBGX61q1bmDNnDnbt2qXThhERERERUdHId1LQuXNn/PTTTwCAp0+fomHDhpg5cya6dOmChQsX6ryBRERERESkX/lOCk6ePInXXnsNALBx40a4ubnh1q1b+OmnnzBv3jydN5CIiIiIiPQr30lBQkIC1Go1AGD37t3o2rUrzMzM0KhRI9y6dUvnDSQiIiIiIv3Kd1JQpUoVbNmyBbdv38auXbvQtm1bAEB0dDQcHBx03kAiIiIiItKvfCcF48aNw4gRI+Dt7Y2GDRuicePGAJ5fNahbt67OG0hERERERPqV5ycaZ+jevTuaNWuGyMhI1K5dW5nfunVrvPXWWzptHBERERER6V++kwIAcHd3h7u7u9a8V199VScNIiIiIiKiopWn7kODBg3C7du387TCn3/+GWvWrClUo4iIiIiIqOjk6UpB2bJl4efnhyZNmqBTp06oX78+PD09YWNjgydPnuDixYsIDw/H+vXr8corr2DJkiX6bjcREREREelInpKCb775BkOGDMGyZcuwaNEi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RqFPw/IIquGW5/Kuams9tobItDApICIiokxe7sqTG1105XF1sGF3ICIDYVJAREREmeTUlScr7MpDVLwxKSAiIqJMXu7Kk5SarvTr3ziocZY3/RJR8cWkgIiIiDJ5uStPQkqa8ncNTwfYWRXyECL2LhDiWLh1vCxpPgAX3a6TyETw4WVERERERCaOSQERERERkYljUkBEREREZOKYFBARERERmTgmBUREREREJo5JARERERGRieOQpERERCas4/xwPMjDk4s1IsrfgdMPwEylytP6y6qtsW1IswK3j4iKBpMCIiIiE/YgLhlRsUn5ek90HpIIIipemBQQERERzFSAq9om2+UaESUZcFVb53qlIDouCRrJsQgRGREmBURERARXtQ2Oftk62+UJKWmoMW4XAODAyMBcn2jcaNLefF+BICLD4Y3GREREREQmjkkBEREREZGJY1JARERERGTimBQQEREREZk43mhMRESUT9GxSfkaltNVbQ1Xh+xH9iEiMjQmBURERPm05q8IzN17Nc/lh7X2wWdBvnpsERFR4TApICIiyqc+DcsjqIabMp2Umo7ui/4EAGwc1Bg2luZa5V3V1kXaPl14+WpIUmq68vfFe7FZbiOvhhAVX0wKiIiI8snVwUbrADghJU35u4anQ65j+BcHOV0NyUiAXsSrIUTFW/HfaxEREZHOvXw1JDfF8WoIEf0PkwIiIiLK5OWrIURUsjEpICIiykLH+eF4kMcRhjQiyt+B0w/ATKXK0/vKqq2xbUizArWPiEiXmBQQERFl4UFcMqJik/L9vvwMVUpEZCyYFBAREeXATAW4qnPuRqMRUZIBV7V1rlcKouOSoJEcixARFSkmBUREVCxk150nXSNa3XdyY6ZSwdws64P2rLrzuKptcPTL1jmuMyElDTXG7QIAHBgZmOvoQ40m7c3yKkR225iSpkG6RpPjOl9kbmYGKwuzLJexyxIRZYVJARERFQsF7c5TnJjCNhKRcWJSQERExcrL3XliElOQmJr3s+i2lmZwtLXSmmds3Xle3kZdXCkwtm0kIuPCpICIiIqVl7vzvPzk3dzfn/nJu9l15zGUvHRZyi9j20YiMi5MCoiIqFgzxHj6LyciSanpyt8X78XCxtJcq3xWiQgRkTFhUkBERJRPa/6KwNy9V7Nc1n3Rn5nmDWvtg8+CfPXdLCKiAmNSQERE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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", "\n", - "# Plotting\n", - "fig, ax = plt.subplots()\n", + "fig, ax = plt.subplots(figsize=(9,5))\n", "\n", "# Heights of the bars\n", "decompress = aggregated_reset[('time:decompress', 'mean')]\n", @@ -905,6 +983,7 @@ "\n", "bar_width = 1\n", "\n", + "# Arrange bars in groups by column setup\n", "group_pos = 0\n", "step = 1.25\n", "group_gap = 1\n", @@ -924,14 +1003,13 @@ "p3 = ax.bar(x.position, run_processor, bar_width, yerr=run_processor_err, label='time:run_processor', \n", " facecolor='none', linewidth=2, edgecolor='tab:blue', ecolor='tab:blue', capsize=4)\n", "\n", - "# Adding labels and title\n", - "# ax.set_xlabel('File location and fraction of the size')\n", "ax.set_xticks(x.position, x.file_location)\n", "ax.set_ylabel('Time (s)')\n", - "ax.set_ylim(0,110)\n", + "# ax.set_ylim(0,110)\n", "ax.set_title('')\n", - "ax.legend()\n", - "plt.xticks(rotation=45)\n", + "# ax.legend()\n", + "ax.legend(handles=[p3, p1, p2], labels=['Total run time', 'Data decompression', 'Idle time (waiting for data)'])\n", + "plt.xticks(rotation=60)\n", "\n", "ax2 = ax.secondary_xaxis('bottom')\n", "ax2_labels = x.groupby(\"column_setup\").mean(numeric_only=True).reset_index()\n", @@ -941,30 +1019,8 @@ "ax2.tick_params(which='both', length=0)\n", "\n", "\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3ff7179c-b407-47b6-b8d0-2bb25ed0649b", - "metadata": {}, - "outputs": [], - "source": [ - "# report[\"event_rate\"] = report.n_events / report.run_processor / report.n_columns_read\n", - "# report[\"data_rate_comp\"] = report.compressed_bytes / report.run_processor\n", - "# report[\"data_rate_uncomp\"] = report.uncompressed_bytes / report.run_processor\n", - "# report[[\"column_setup\", \"n_workers\", \"event_rate\", \"data_rate_comp\", \"data_rate_uncomp\"]]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cdc0e36b-a557-407e-98b8-9ca52360933b", - "metadata": {}, - "outputs": [], - "source": [ - "# report.compressed_bytes / report.n_events * report.n_columns_read" + "plt.show()\n", + "fig.savefig(f\"{output_path}/plot.pdf\", bbox_inches='tight')" ] }, {