43b84bf0bb
- Introduced functionality to export hit rates and average ages as markdown files. - Generated `hit_rates.md` and `avg_ages.md` for easier sharing and reporting. Signed-off-by: Tuan-Dat Tran <tuan-dat.tran@tudattr.dev>
421 lines
62 KiB
Plaintext
421 lines
62 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"id": "ae430903-55a2-47ed-87c6-677b1fb44198",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from enum import Enum\n",
|
||
"import os\n",
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"id": "9d6920fc-8633-4754-a762-ece23af18877",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Types of cache\n",
|
||
"class CacheType(Enum):\n",
|
||
" LRU = 1\n",
|
||
" RANDOM_EVICTION = 2\n",
|
||
"\n",
|
||
"\n",
|
||
"DATABASE_OBJECTS = 100 # Number of objects in the database"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"id": "9b8c0686-1bab-47a4-9f9f-e5a11167ea8c",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"configurations = {\n",
|
||
" \"default\": (DATABASE_OBJECTS, 10, CacheType.LRU, 5),\n",
|
||
" \"No Refresh\": (DATABASE_OBJECTS, 0, CacheType.LRU, 5),\n",
|
||
" \"Infinite TTL\": (int(DATABASE_OBJECTS / 2), 0, CacheType.LRU, 0),\n",
|
||
" \"Random Eviction\": (int(DATABASE_OBJECTS / 2), 10, CacheType.RANDOM_EVICTION, 5),\n",
|
||
" \"RE without Refresh\": (int(DATABASE_OBJECTS / 2), 0, CacheType.RANDOM_EVICTION, 5),\n",
|
||
" \"No Refresh (0.5s ttl)\": (DATABASE_OBJECTS, 0, CacheType.LRU, 0.5),\n",
|
||
" \"No Refresh (1.0s ttl)\": (DATABASE_OBJECTS, 0, CacheType.LRU, 1),\n",
|
||
" \"No Refresh (2.0s ttl)\": (DATABASE_OBJECTS, 0, CacheType.LRU, 2),\n",
|
||
" \"No Refresh (3.0s ttl)\": (DATABASE_OBJECTS, 0, CacheType.LRU, 3),\n",
|
||
" \"No Refresh (4.0s ttl)\": (DATABASE_OBJECTS, 0, CacheType.LRU, 4),\n",
|
||
" \"No Refresh (5.0s ttl)\": (DATABASE_OBJECTS, 0, CacheType.LRU, 5),\n",
|
||
"}\n",
|
||
"\n",
|
||
"experiments = [k.replace(\" \", \"_\").replace(\"(\", \"\").replace(\")\", \"\").replace(\".\", \"_\") for k in configurations.keys()]\n",
|
||
"experiments = [os.path.join(\"./experiments/\",e, \"overall_hit_age.csv\") for e in experiments if \"_ttl\" in e]\n",
|
||
"experiments = [{'ttl': '.'.join(file.split('/')[2].split(\"_\")[2:4]),'data': pd.read_csv(file)} for file in experiments]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"id": "5be1df01-5dc8-43fe-a597-72ba76eefc0f",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"[{'ttl': '0.5s',\n",
|
||
" 'data': {'hit_rate': 0.458669533255314, 'avg_age': 0.2405818161600988}},\n",
|
||
" {'ttl': '1.0s',\n",
|
||
" 'data': {'hit_rate': 0.6137075818807132, 'avg_age': 0.4914356220831488}},\n",
|
||
" {'ttl': '2.0s',\n",
|
||
" 'data': {'hit_rate': 0.7510045829957603, 'avg_age': 1.0028764694071644}},\n",
|
||
" {'ttl': '3.0s',\n",
|
||
" 'data': {'hit_rate': 0.8151181771596068, 'avg_age': 1.486159537458237}},\n",
|
||
" {'ttl': '4.0s',\n",
|
||
" 'data': {'hit_rate': 0.8521008724556234, 'avg_age': 1.9920411130528224}},\n",
|
||
" {'ttl': '5.0s',\n",
|
||
" 'data': {'hit_rate': 0.877309770620863, 'avg_age': 2.4590330715633857}}]"
|
||
]
|
||
},
|
||
"execution_count": 4,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"stats = [\n",
|
||
" {'ttl': e['ttl'],\n",
|
||
" 'data': {\n",
|
||
" \"hit_rate\": e['data']['hit_rate'][1], \n",
|
||
" \"avg_age\": e['data']['avg_age'][1]\n",
|
||
" }\n",
|
||
" } for e in experiments]\n",
|
||
"stats"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"id": "26030d03-b970-4e88-9c9a-e96ef79181c6",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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35dffqn4+HinamjatKnuu+8+/fvf/9a1a9cyfeb58+dzrKtEiRLq0aOHFi9erIULF8rPzy/TPbZv3y9erFgxVa9eXSkpKTm+PwAABRUz3QAA5IPGjRvL29tbb775phITE+Xv76/OnTurXLlyuXofX19fjR8/Xn//+9+1atUq9ezZUw8++KBeffVVjRgxQm3atNGuXbs0f/58VatWzeG19913n0qUKKHZs2crJCREwcHBatmypapWraqPP/5YvXr1Ur169TRixAiFh4crPj5e69atU2hoqP773//mWNuAAQP02GOP6f3331ePHj1UokQJh+t169ZVx44d1bRpU5UqVUrbtm3TkiVLNHbs2Fz9GeSVbdu26Z///Gem9o4dO6pdu3ZuqAgAUBgRugEAyAfly5fX7NmzNXXqVD355JMym81at25drkO3JD311FP65z//qX/961/q2bOnXnzxRSUnJ2vBggVatGiR7r//fq1YsUIvvPCCw+t8fX31ySefaOLEiXr66aeVlpamefPmqWrVqurYsaO2bNmi1157TTNnztS1a9dUvnx5tWzZUqNHj3aqroceekiBgYG6evWqBgwYkOn6uHHj9M0332j16tVKSUlR5cqV9c9//lN///vfc/1nkBe2bt2qrVu3Zmp/7bXXCN0AgDxjst6+Hg0AAAAAAOQJ9nQDAAAAAOAihG4AAAAAAFyE0A0AAAAAgIsQugEAAAAAcBFCNwAAAAAALkLoBgAAAADARYrcfbotFovOnDmjkJAQmUwmd5cDAAAAACiArFarrl69qooVK8rLK/v57CIXus+cOaPIyEh3lwEAAAAAKAROnTqliIiIbK8XudAdEhIiyfiDCQ0NdXM12UtNTdXq1avVvXt3+fr6urscwIaxCU/F2ISnYmzCUzE24akKythMSkpSZGSkLWNmp8iF7vQl5aGhoR4fuoOCghQaGurRAw1FD2MTnoqxCU/F2ISnYmzCUxW0sZnTtmUOUgMAAAAAwEUI3QAAAAAAuAihGwAAAADgEcxmaf16kzZsCNf69SaZze6u6N4RugEAAAAAbrd0qVSlitStm4+mTWumbt18VKWK0V6QEboBAAAAAG61dKnUv790+rRje3y80V6QgzehGwAAAADgNmazNH68ZLVmvpbe9uyzKrBLzYvcLcMAAAAAAK5ltUpJSdKlS/bH5cuOz9Pb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sCQpJCREO3bs0BdffKEKFSrolVdeUaNGjXTlypW8Lh9wUL58+SzHcmhoqAIDA+Xt7a3Y2FitXLlSdevW1XvvvadatWrp2LFjbqoYBd3YsWP17bffat26dYqIiLhj3+zGZ/rPWn52Iq/4+fmpevXqatq0qaZOnapGjRppxowZWfZlXCI/bN++XX/88Yfuv/9++fj4yMfHR+vXr9e7774rHx8fmc3mTK9hbMJdSpQooZo1a9qyze0K29gkdOcDPz8/NW3aVGvWrLG1WSwWrVmzJtv9X7czm83atWuXKlSoYGvz8fFR165d9X//93/6/fffdfz4ca1duzbP6wcyat26tcNYlqTY2FiHsWwymdS2bVtNmTJFv/76q/z8/LRs2bL8LhUFnNVq1dixY7Vs2TKtXbtWVatWzfE1zoxPfnbCFSwWi1JSUrK8xrhEfujSpYt27dqlnTt32h7NmjXTkCFDtHPnTnl7e2d6DWMT7nLt2jUdOXLEIdtkVNjGJnu688mECRM0bNgwNWvWTC1atND06dOVnJysESNGSJIef/xxhYeHa+rUqZKkV199Va1atVL16tV15coVvfXWWzpx4oRGjhwpSfr222919OhRdejQQSVLltR3330ni8WiWrVque07omC6du2aw78yHjt2TDt37lSpUqVUqVIlTZw4UfHx8fr0008lSU8//bRmzpyp559/Xk888YTWrl2rxYsXa8WKFZKkrVu3as2aNerevbvKlSunrVu36vz586pTp45bvh8KrjFjxmjBggX6+uuvFRISYtvHVbx4cQUGBkrK/LNz/PjxioqK0ttvv63evXtr4cKF2rZtmz788ENJ/OxE3pg4caJ69eqlSpUq6erVq1qwYIHi4uJst05kXMIdQkJCMp15ERwcrNKlS9vaGZtwl7/97W/q06ePKleurDNnzmjSpEny9vbWoEGDJBWBsenu49OLkvfee89aqVIlq5+fn7VFixbWn376yXYtKirKOmzYMNvzZ5991tY3LCzM+sADD1h37Nhhu75x40ZrVFSUtWTJktbAwEBrw4YNrYsWLcrPr4NCYt26dVZJmR7p43HYsGHWqKioTK9p3Lix1c/Pz1qtWjXrvHnzbNf27t1r7dGjh7Vs2bJWf39/a82aNa3vvfde/n0hFBpZjUtJDuPt9p+dVqvVunjxYmvNmjWtfn5+1nr16llX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",
|
||
"text/plain": [
|
||
"<Figure size 1000x600 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Extract TTL, hit_rate, and avg_age from data\n",
|
||
"ttls = [entry['ttl'] for entry in stats]\n",
|
||
"hit_rates = [entry['data']['hit_rate'] for entry in stats]\n",
|
||
"avg_ages = [entry['data']['avg_age'] for entry in stats]\n",
|
||
"\n",
|
||
"# Plotting\n",
|
||
"plt.figure(figsize=(10, 6))\n",
|
||
"\n",
|
||
"# Plot hit_rate\n",
|
||
"plt.subplot(2, 1, 1)\n",
|
||
"plt.plot(ttls, hit_rates, marker='o', color='b', label='Hit Rate')\n",
|
||
"plt.xlabel('TTL (seconds)')\n",
|
||
"plt.ylabel('Hit Rate')\n",
|
||
"plt.title('Hit Rate vs TTL')\n",
|
||
"plt.grid(True)\n",
|
||
"\n",
|
||
"# Plot avg_age\n",
|
||
"plt.subplot(2, 1, 2)\n",
|
||
"plt.plot(ttls, avg_ages, marker='o', color='r', label='Avg Age')\n",
|
||
"plt.xlabel('TTL (seconds)')\n",
|
||
"plt.ylabel('Avg Age')\n",
|
||
"plt.title('Avg Age vs TTL')\n",
|
||
"plt.grid(True)\n",
|
||
"\n",
|
||
"# Show the plots\n",
|
||
"plt.tight_layout()\n",
|
||
"plt.savefig(\"./experiments/hr_and_age_vs_ttl\")\n",
|
||
"plt.show()\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"id": "58a7865b-6ce6-4960-8dc5-c926d5463949",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"pd.DataFrame(hit_rates, columns=[\"hit_rates\"]).to_markdown('./experiments/hit_rates.md')\n",
|
||
"pd.DataFrame(avg_ages, columns=[\"avg_ages\"]).to_markdown('./experiments/avg_ages.md')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"id": "a92dcf86-d0ae-4f5c-937f-aeac45ac0dea",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"details = [k.replace(\" \", \"_\").replace(\"(\", \"\").replace(\")\", \"\").replace(\".\", \"_\") for k in configurations.keys()]\n",
|
||
"details = [os.path.join(\"./experiments/\",e, \"details.csv\") for e in details if \"_ttl\" in e]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"id": "0ffb1366-83ea-49ab-83ca-945ed993ef3f",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"['./experiments/No_Refresh_0_5s_ttl/details.csv',\n",
|
||
" './experiments/No_Refresh_1_0s_ttl/details.csv',\n",
|
||
" './experiments/No_Refresh_2_0s_ttl/details.csv',\n",
|
||
" './experiments/No_Refresh_3_0s_ttl/details.csv',\n",
|
||
" './experiments/No_Refresh_4_0s_ttl/details.csv',\n",
|
||
" './experiments/No_Refresh_5_0s_ttl/details.csv']"
|
||
]
|
||
},
|
||
"execution_count": 8,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"details"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"id": "6e48f78f-15a3-4788-8ac9-6ad1fabbee26",
|
||
"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>0.5s</th>\n",
|
||
" <th>1.0s</th>\n",
|
||
" <th>2.0s</th>\n",
|
||
" <th>3.0s</th>\n",
|
||
" <th>4.0s</th>\n",
|
||
" <th>5.0s</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>obj_id</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>3</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>3</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5</th>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>95</th>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>97</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>98</th>\n",
|
||
" <td>37</td>\n",
|
||
" <td>37</td>\n",
|
||
" <td>37</td>\n",
|
||
" <td>37</td>\n",
|
||
" <td>37</td>\n",
|
||
" <td>37</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>99</th>\n",
|
||
" <td>4</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>4</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>99 rows × 6 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" 0.5s 1.0s 2.0s 3.0s 4.0s 5.0s\n",
|
||
"obj_id \n",
|
||
"1 1 1 1 1 1 1\n",
|
||
"2 3 3 3 3 3 3\n",
|
||
"3 1 1 1 1 1 1\n",
|
||
"4 1 1 1 1 1 1\n",
|
||
"5 2 2 2 2 2 2\n",
|
||
"... ... ... ... ... ... ...\n",
|
||
"95 2 2 2 2 2 2\n",
|
||
"96 1 1 1 1 1 1\n",
|
||
"97 1 1 1 1 1 1\n",
|
||
"98 37 37 37 37 37 37\n",
|
||
"99 4 4 4 4 4 4\n",
|
||
"\n",
|
||
"[99 rows x 6 columns]"
|
||
]
|
||
},
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd.concat([pd.read_csv(file,index_col=\"obj_id\")['lambda'].rename(f\"{'.'.join(file.split('/')[2].split(\"_\")[2:4])}\") for file in details], axis=1)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"id": "3e0ddc4a-bede-4921-8ce8-427ef028e19e",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"43375"
|
||
]
|
||
},
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"sum(pd.read_csv(\"./experiments/No_Refresh_0_5s_ttl/details.csv\",index_col=\"obj_id\")['access_count'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "e324fbe8-24a6-49e8-96b9-d1a1a49f9644",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "graphs",
|
||
"language": "python",
|
||
"name": "graphs"
|
||
},
|
||
"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.12.7"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 5
|
||
}
|