age_cache_simulation/aoi_cache_experiment_eval.ipynb
Tuan-Dat Tran 5785827899 feat(simulation): Ran simulation with 1000
Signed-off-by: Tuan-Dat Tran <tuan-dat.tran@tudattr.dev>
2024-11-28 16:01:52 +01:00

442 lines
63 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"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.4598106970725175, 'avg_age': 0.2481284749416605}},\n",
" {'ttl': '1.0s',\n",
" 'data': {'hit_rate': 0.6106589394405821, 'avg_age': 0.5015452422120209}},\n",
" {'ttl': '2.0s',\n",
" 'data': {'hit_rate': 0.7277601169941756, 'avg_age': 0.9972298475197796}},\n",
" {'ttl': '3.0s',\n",
" 'data': {'hit_rate': 0.8159040915293513, 'avg_age': 1.4993537506269703}},\n",
" {'ttl': '4.0s',\n",
" 'data': {'hit_rate': 0.8529286517016675, 'avg_age': 1.9959603082017117}},\n",
" {'ttl': '5.0s',\n",
" 'data': {'hit_rate': 0.8725120313088975, 'avg_age': 2.498238888150122}}]"
]
},
"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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YWvz9PSU1Wp16Pfll18qLS2tSDW0a9dOt912m9566y1lZmbme89Tp07dsK4qVaqoX79+mjdvnubMmSMfH598e2xfe794YGCgGjZsqOzs7Bu+PgAAZRUz3QAAlILWrVvL09NT//jHP5Seni5fX1/17NlTISEhxXodb29vjRs3Tn/+85+1dOlS9e/fX3fddZdee+01jRo1Sl26dNHWrVs1a9YsNWjQwOHc2267TVWqVNG0adMUFBSkSpUqKSoqSvXr19enn36qAQMGqHnz5ho1apTCwsKUlpampKQkBQcH63//+98Naxs2bJgeeughffjhh+rXr5+qVKnicLxZs2aKiYlRu3btVK1aNW3YsEHz58/X2LFji/VnUFI2bNigv/71r/naY2Ji1K1bNxdUBAAojwjdAACUglq1amnatGmaPHmyfve738lsNispKanYoVuSfv/73+uvf/2r/v73v6t///76y1/+oqysLM2ePVtz585V27ZttXjxYr344osO53l7e+vf//63JkyYoCeffFK5ubmaMWOG6tevr5iYGK1Zs0avv/66PvjgA2VmZqpWrVqKiorSE088UaS67r77bvn7++vChQsaNmxYvuNPP/20vv76ay1btkzZ2dmqV6+e/vrXv+rPf/5zsf8MSsLatWu1du3afO2vv/46oRsAUGJM1muvRwMAAAAAACWCe7oBAAAAAHASQjcAAAAAAE5C6AYAAAAAwEkI3QAAAAAAOAmhGwAAAAAAJyF0AwAAAADgJBVun26LxaKjR48qKChIJpPJ1eUAAAAAAMogq9WqCxcuqE6dOvLwKHw+u8KF7qNHjyoiIsLVZQAAAAAAyoHDhw8rPDy80OMVLnQHBQVJMv5ggoODXVxN4XJycrRs2TL17dtX3t7eri4HsGFswl0xNuGuGJtwV4xNuKuyMjYzMjIUERFhy5iFqXChO++S8uDgYLcP3QEBAQoODnbrgYaKh7EJd8XYhLtibMJdMTbhrsra2LzRbcsspAYAAAAAgJMQugEAAAAAcBJCNwAAAADALZjNUkqKSampYUpJMclsdnVFt47QDQAAAABwuYQEKTJS6tPHS1OmtFefPl6KjDTayzJCNwAAAADApRISpKFDpSNHHNvT0oz2shy8Cd0AAAAAAJcxm6Vx4ySrNf+xvLZnnlGZvdS8wm0ZBgAAAAAoWRaLlJkpZWQU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+nbq1ElfffWVcwsCAKCYCN0AADiJyWS67iMmJuaGx6XiBc88EyZM0B//+EcFBQWV/AdzUy+99JJefPFFWSwWV5cCAICNl6sLAACgvDp27Jjt93PnztUrr7yiXbt22dquXLkiHx8fSdLhw4fVsWNHff/992revLkk2Y4V16FDh/TNN9/o/fffv4Xqy54BAwbo8ccf15IlSzRw4EBXlwMAgCRmugEAcJpatWrZHpUrV5bJZHJoq1u3ru33NWvWlCRVr17d1latWrWbet958+apVatWCgsLs7UdPHhQgwYNUtWqVVWpUiU1b95c3377re34tm3bNGDAAAUGBio0NFQPP/ywTp8+bTtusVj0z3/+Uw0bNpSvr6/q1q2rv/3tb7bjW7duVc+ePeXv76/q1avr97//vTIzM23HH330UQ0ZMkRvvfWWateurerVq2vMmDHKycmx9Tl58qQGDRokf39/1a9fX7NmzXL4XFarVa+++qrq1q0rX19f1alTR08//bTtuKenp+68807NmTPnpv7cAABwBkI3AADlzMqVK9W+fXuHtjFjxig7O1upqanaunWr/vGPfygwMFCSdP78efXs2VNt2rTRhg0btHTpUp04cUL333+/7fwJEybo73//u15++WXt2LFDs2fPVmhoqCQpKytL/fr1U9WqVbV+/Xp9+eWX+v777zV27FiHGpKSkrRv3z4lJSXp3//+t2bOnKmZM2fajj/66KM6fPiwkpKSNH/+fH344Yc6efKk7fhXX32ld955Rx999JH27NmjhQsXqkWLFg7v0bFjR61cubJE/hwBACgJXF4OAEA5c/DgwXyh+9ChQ7r33nttIbVBgwa2Yx988IHatGmjN954w9b22WefKSIiQrt371bt2rX17rvv6oMPPtDIkSMlSbfddpu6desmSZo9e7YuX76szz//XJUqVbK95qBBg/SPf/zDFs6rVq2qDz74QJ6enmrSpIkGDhyo5cuXa/To0dq9e7eWLFmidevWqUOHDpKk6dOnq2nTpg6foVatWurdu7e8vb1Vt25ddezY0eFz1qlTR4cPH5bFYpGHB3MLAADX4/9GAACUM5cuXZKfn59D29NPP62//vWv6tq1qyZOnKiff/7ZdmzLli1KSkpSYGCg7dGkSRNJ0r59+/TLL78oOztbvXr1KvD9fvnlF7Vq1coWuCWpa9euslgsDvewN2/eXJ6enrbntWvXts1k//LLL/Ly8lK7du1sx5s0aaIqVarYnt933326dOmSGjRooNGjR2vBggXKzc11qMXf318Wi0XZ2dlF/eMCAMCpCN0AAJQzNWrU0Llz5xzaHn/8cf366696+OGHtXXrVrVv39620FpmZqYGDRqkzZs3Ozz27NmjHj16yN/fv0Tq8vb2dnhuMpmKtdJ4RESEdu3apQ8//FD+/v76wx/+oB49ejjcF3727FlVqlSpxGoGAOBWEboBAChn2rRpox07duRrj4iI0JNPPqmEhAT96U9/0ieffCJJatu2rbZv367IyEg1bNjQ4VGpUiU1atRI/v7+Wr58eYHv17RpU23ZskVZWVm2th9++EEeHh5q3LhxkWpu0qSJcnNztXHjRlvbrl27dP78eYd+/v7+GjRokN577z0lJydrzZo12rp1q+34tm3b1KZNmyK9JwAApYHQDQBAGZCWlpZvJvra2ew8/fr105o1a2Q2m21tzzzzjL777jvt379fmzZtUlJSku1+6TFjxujs2bMaMWKE1q9fr3379um7777TqFGjZDab5efnpxdeeEHPP/+8Pv/8c+3bt08//vijpk+fLkl68MEH5efnp5EjR2rbtm1KSkrSH//4Rz388MO2+7lvpHHjxurfv7+eeOIJrV27Vhs3btTjjz/uMGM9c+ZMTZ8+Xdu2bdOvv/6q//73v/L391e9evVsfVauXKm+ffsW+88XAABnIXQDAFAGvPXWW2rTpo3DY/HixQX2HTBggLy8vPT999/b2sxms8aMGaOmTZuqf//+uv322/Xhhx9KMhYf++GHH2Q2m9W3b1+1aNFCzzzzjKpUqWJbjOzll1/Wn/70J73yyitq2rSphg0bZrsfOyAgQN99953Onj2rDh06aOjQoerVq5c++OCDYn3GGTNmqE6dOoqOjlZcXJx+//vfKyQkxHa8SpUq+uSTT9S1a1e1bNlS33//vf73v/+pevXqkowfTKxevVqjRo0q1vsCAOBMJqvVanV1EQAAoGRNnTpVX3/9tb777jtXl1JqXnjhBZ07d04ff/yxq0sBAMCGLcMAACiHnnjiCZ0/f14XLlxQUFCQq8spFSEhIRo/fryrywAAwAEz3QAAAAAAOAn3dAMAAAAA4CSEbgAAAAAAnITQDQAAAACAkxC6AQAAAABwEkI3AAAAAABOQugGAAAAAMBJCN0AAAAAADgJoRsAAAAAACchdAMAAAAA4CSEbgAAAAAAnITQDQAAAACAkxC6AQAAAABwEkI3AAAAAABOQugGAAAAAMBJCN0AAAAAADgJoRsAgCL68MMPZTKZFBUV5epSJLlfPc4QExMjk8l0w0dR+7366quSpMjISN11112u/XAAgArBZLVara4uAgCAsqBr1646evSoDhw4oD179qhhw4bU42SJiYk6ceKE7fn69ev13nvv6S9/+YuaNm1qaz9z5oyqV69+w34tW7ZUy5YtFRkZqTvuuEPffPNN6XwQAECF5eXqAgAAKAv279+v1atXKyEhQU888YRmzZqliRMnUo+T9enTx+G5n5+f3nvvPfXp00cxMTGFnlfUfgAAOBuXlwMAUASzZs1S1apVNXDgQA0dOlSzZs2yHcvJyVG1atU0atSofOdlZGTIz89Pzz33nK3t4MGDuvvuu1WpUiWFhITo2Wef1XfffSeTyaTk5ORbrudqZ86c0cMPP6zg4GBVqVJFI0eO1JYtW2QymTRz5kyHvjt37tTQoUNVrVo1+fn5qX379vr666+vW0dxP/v777+v5s2bKyAgQFWrVlX79u01e/bsIn1mAADKIkI3AABFMGvWLMXFxcnHx0cjRozQnj17tH79ekmSt7e37rnnHi1cuFBXrlxxOG/hwoXKzs7W8OHDJUlZWVnq2bOnvv/+ez399NP6v//7P61evVovvPBCidWTx2KxaNCgQfriiy80cuRI/e1vf9OxY8c0cuTIfK+3fft2derUSb/88otefPFFvf3226pUqZKGDBmiBQsWFFpHcT77J598oqefflrNmjVTfHy8Jk2apNatW2vt2rXF+uwAAJQlXF4OAMANbNy4UTt37tT7778vSerWrZvCw8M1a9YsdejQQZI0bNgwffbZZ1q2bJnDAl1z585VgwYN1L59e0nSRx99pF9//VULFy7U4MGDJUlPPPGE2rRpU6L1SEboXbNmjeLj4zVu3DhJ0lNPPZXvkm1JGjdunOrWrav169fL19dXkvSHP/xB3bp10wsvvKB77rmn0HqK+tkXL16s5s2b68svvyzyZwUAoKxjphsAgBuYNWuWQkNDFRsbK0kymUwaNmyY5syZI7PZLEnq2bOnatSooblz59rOO3funBITEzVs2DBb29KlSxUWFqa7777b1ubn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8YZzCwIA4BsidAMA4CQWi6XV7YEHHvjaeembBc9b5s2bp6effloBAQFtf2Ae6pe//KV+8YtfyG63u7sUAABM3u4uAACAjqq6utr8ef369Zo/f74qKyvNsevXr8vHx0eSdPbsWSUlJWnnzp2Ki4uTJHPumzpz5ow2b96spUuXfofq25/09HRNnz5d27ZtU0ZGhrvLAQBAEme6AQBwmr59+5pbjx49ZLFYHMbCw8PNn/v06SNJ6t27tznWq1evb/W6GzZsUEJCgvr162eOnT59WpmZmQoMDJS/v7/i4uK0detWc76iokLp6enq1q2bgoODNWnSJH322WfmvN1u18svv6yoqCj5+voqPDxcv/71r8358vJyjRo1SlarVb1799aTTz6p+vp6c37KlCkaO3asFi1apJCQEPXu3Vs5OTm6ceOGuaampkaZmZmyWq268847tXbtWofjMgxDzz//vMLDw+Xr66vQ0FDNmjXLnPfy8tLDDz+swsLCb/V7AwDAGQjdAAB0MPv27dPQoUMdxnJycnTt2jXt3btX5eXleumll9StWzdJUm1trUaNGqXExEQdPnxYb731li5cuKDHH3/c3H/evHlauHChnnvuOR07dkzr1q1TcHCwJKmhoUFpaWkKDAzUoUOHtHHjRu3cuVMzZ850qKGkpERVVVUqKSnRn//8ZxUUFKigoMCcnzJlis6ePauSkhK9/vrrWr58uWpqasz5N954Q3/4wx+0YsUKnThxQm+++aYGDRrk8BpJSUnat29fm/weAQBoC3y8HACADub06dNNQveZM2f06KOPmiE1MjLSnMvPz1diYqJ+85vfmGOvvfaawsLC9OGHHyokJERLlixRfn6+srOzJUnf//739cMf/lCStG7dOn3xxRdas2aN/P39zefMzMzUSy+9ZIbzwMBA5efny8vLSzExMcrIyFBxcbGeeOIJffjhh9q2bZveffddDRs2TJK0atUqxcbGOhxD3759NXr0aHXt2lXh4eFKSkpyOM7Q0FCdPXtWdrtdXbpwbgEA4H78NQIAoIO5evWq/Pz8HMZmzZqlX/3qV0pOTlZeXp4++OADc+79999XSUmJunXrZm4xMTGSpKqqKh0/flzXrl1Tampqs693/PhxJSQkmIFbkpKTk2W32x2uYY+Li5OXl5f5OCQkxDyTffz4cXl7e2vIkCHmfExMjHr27Gk+HjdunK5evarIyEg98cQTKioq0s2bNx1qsVqtstvtunbt2u3+ugAAcCpCNwAAHcwdd9yhS5cuOYxNnz5dJ0+e1KRJk1ReXq6hQ4eaX7RWX1+vzMxMlZWVOWwnTpzQyJEjZbVa26Surl27Ojy2WCzf6JvGw8LCVFlZqeXLl8tqtepnP/uZRo4c6XBd+MWLF+Xv799mNQMA8F0RugEA6GASExN17NixJuNhYWF66qmntGnTJj3zzDNauXKlJGnw4ME6evSoBgwYoKioKIfN399fd911l6xWq4qLi5t9vdjYWL3//vtqaGgwx95++2116dJF0dHRt1VzTEyMbt68qdLSUnOssrJStbW1DuusVqsyMzP1yiuvaPfu3dq/f7/Ky8vN+YqKCiUmJt7WawIA4AqEbgAA2oFz5841ORP91bPZt6SlpWn//v2y2WzmWG5urrZv365Tp07pyJEjKikpMa+XzsnJ0cWLFzVhwgQdOnRIVVVV2r59u6ZOnSqbzSY/Pz89++yzmjt3rtasWaOqqiodOHBAq1atkiRNnDhRfn5+ys7OVkVFhUpKSvT0009r0qRJ5vXcXyc6OloPPfSQZsyYoYMHD6q0tFTTp093OGNdUFCgVatWqaKiQidPntRf/vIXWa1WRUREmGv27dunMWPGfOPfLwAAzkLoBgCgHVi0aJESExMdti1btjS7Nj09Xd7e3tq5c6c5ZrPZlJOTo9jYWD300EMaOHCgli9fLqnxy8fefvtt2Ww2jRkzRoMGDVJubq569uxpfhnZc889p2eeeUbz589XbGysxo8fb16P/b3vfU/bt2/XxYsXNWzYMD322GNKTU1Vfn7+NzrG1atXKzQ0VCkpKcrKytKTTz6poKAgc75nz55auXKlkpOTFR8fr507d+of//iHevfuLanxHxPvvPOOpk6d+o1eFwAAZ7IYhmG4uwgAANC2li1bpr///e/avn27u0txmWeffVaXLl3Sq6++6u5SAAAwccswAAA6oBkzZqi2tlZ1dXUKCAhwdzkuERQUpDlz5ri7DAAAHHCmGwAAAAAAJ+GabgAAAAAAnITQDQAAAACAkxC6AQAAAABwEkI3AAAAAABOQugGAAAAAMBJCN0AAAAAADgJoRsAAAAAACchdAMAAAAA4CSEbgAAAAAAnITQDQAAAACAk/wPdr2/4j2T/WwAAAAASUVORK5CYII=",
"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": "c4a8220e-9a21-42db-889a-26d901672f5e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['0.5s', '1.0s', '2.0s', '3.0s', '4.0s', '5.0s']"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ttls"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "58a7865b-6ce6-4960-8dc5-c926d5463949",
"metadata": {},
"outputs": [],
"source": [
"pd.DataFrame(hit_rates, columns=[\"hit_rates\"], index=ttls).to_markdown('./experiments/hit_rates.md')\n",
"pd.DataFrame(avg_ages, columns=[\"avg_ages\"], index=ttls).to_markdown('./experiments/avg_ages.md')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"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": 9,
"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": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"details"
]
},
{
"cell_type": "code",
"execution_count": 10,
"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>8</td>\n",
" <td>32</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>19</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>5</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>3</td>\n",
" <td>14</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1</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>96</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</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>2</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>98</th>\n",
" <td>37</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>99</th>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>100</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>100 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 8 32 3 1 1\n",
"2 3 1 1 1 3 19\n",
"3 1 1 5 1 1 1\n",
"4 1 3 14 4 1 1\n",
"5 2 1 1 1 2 1\n",
"... ... ... ... ... ... ...\n",
"96 1 1 2 1 1 1\n",
"97 1 1 2 2 1 1\n",
"98 37 1 1 2 1 1\n",
"99 4 2 1 1 2 1\n",
"100 2 4 1 4 2 1\n",
"\n",
"[100 rows x 6 columns]"
]
},
"execution_count": 10,
"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": 11,
"id": "3e0ddc4a-bede-4921-8ce8-427ef028e19e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"372850"
]
},
"execution_count": 11,
"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
}