{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "71f85f2a-423f-44d2-b80d-da9ac8d3961a", "metadata": {}, "outputs": [], "source": [ "import simpy\n", "import random\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "from enum import Enum\n", "import os\n", "import shutil\n", "from tqdm import tqdm\n", "\n", "# Types of cache\n", "class CacheType(Enum):\n", " LRU = 1\n", " RANDOM_EVICTION = 2\n", "\n", "# Constants\n", "SEED = 42\n", "DATABASE_OBJECTS = 100 # Number of objects in the database\n", "ACCESS_COUNT_LIMIT = 2000 # Total time to run the simulation\n", "EXPERIMENT_BASE_DIR = \"./experiments/\"\n", "TEMP_BASE_DIR = \"./.aoi_cache/\"\n", "\n", "ZIPF_CONSTANT = 2 # Shape parameter for the Zipf distribution (controls skewness) Needs to be: 1< \n", "\n", "# Set random seeds\n", "random.seed(SEED)\n", "np.random.seed(SEED)\n", "\n", "os.makedirs(TEMP_BASE_DIR, exist_ok=True)" ] }, { "cell_type": "markdown", "id": "9a37d7a3-3e11-4b89-8dce-6091dd38b16f", "metadata": {}, "source": [ "How to set certain parameters for specific scenarios\n", "\n", "\n", "| Name | Cache Capacity | MAX_REFRESH_RATE | cache_type | CACHE_TTL |\n", "| -------------------- | -------------------- | ---------------- | ------------------------- | --------- |\n", "| Default | DATABASE_OBJECTS | 1< | CacheType.LRU | 5 |\n", "| No Refresh | DATABASE_OBJECTS | 0 | CacheType.LRU | 5 |\n", "| Infinite TTL | DATABASE_OBJECTS / 2 | 0 | CacheType.LRU | 0 |\n", "| Random Eviction (RE) | DATABASE_OBJECTS / 2 | 1< | CacheType.RANDOM_EVICTION | 5 |\n", "| RE without Refresh | DATABASE_OBJECTS / 2 | 0 | CacheType.RANDOM_EVICTION | 5 |\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "3d0ab5b1-162a-42c8-80a3-d31f763101f1", "metadata": {}, "outputs": [], "source": [ "# Configuration (Just example, will be overwritten in next block\n", "CACHE_CAPACITY = DATABASE_OBJECTS # Maximum number of objects the cache can hold\n", "\n", "# MAX_REFRESH_RATE is used as the maximum for a uniform\n", "# distribution for mu.\n", "# If MAX_REFRESH_RATE is 0, we do not do any refreshes.\n", "MAX_REFRESH_RATE = 0\n", "\n", "cache_type = CacheType.LRU\n", "\n", "# CACHE_TTL is used to determin which TTL to set when an\n", "# object is pulled into the cache\n", "# If CACHE_TTL is set to 0, the TTL is infinite\n", "CACHE_TTL = 5\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "3ff299ca-ec65-453b-b167-9a0f7728a207", "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", "experiment_name = \"No Refresh (5.0s ttl)\"\n", "config = configurations[experiment_name]\n", "\n", "CACHE_CAPACITY = config[0]\n", "MAX_REFRESH_RATE = config[1]\n", "cache_type = config[2]\n", "CACHE_TTL = config[3]\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "5cea042f-e9fc-4a1e-9750-de212ca70601", "metadata": {}, "outputs": [], "source": [ "class Database:\n", " def __init__(self):\n", " # Each object now has a specific refresh rate 'mu'\n", " self.data = {i: f\"Object {i}\" for i in range(1, DATABASE_OBJECTS + 1)}\n", " self.lambda_values = {i: np.random.zipf(ZIPF_CONSTANT) for i in range(1, DATABASE_OBJECTS + 1)} # Request rate 'lambda' for each object\n", " # Refresh rate 'mu' for each object\n", " if MAX_REFRESH_RATE == 0:\n", " self.mu_values = {i: 0 for i in range(1,DATABASE_OBJECTS + 1)} \n", " else:\n", " self.mu_values = {i: np.random.uniform(1, MAX_REFRESH_RATE) for i in range(1, DATABASE_OBJECTS + 1)}\n", " self.next_request = {i: np.random.exponential(1/self.lambda_values[i]) for i in range(1, DATABASE_OBJECTS + 1)}\n", "\n", "\n", " def get_object(self, obj_id):\n", " # print(f\"[{env.now:.2f}] Database: Fetched {self.data.get(obj_id, 'Unknown')} for ID {obj_id}\")\n", " return self.data.get(obj_id, None)" ] }, { "cell_type": "code", "execution_count": 5, "id": "499bf543-b2c6-4e4d-afcc-0a6665ce3ae1", "metadata": {}, "outputs": [], "source": [ "class Cache:\n", " def __init__(self, env, db, cache_type):\n", " self.cache_type = cache_type\n", " self.env = env\n", " self.db = db\n", " self.storage = {} # Dictionary to store cached objects\n", " self.ttl = {} # Dictionary to store TTLs\n", " self.initial_fetch = {} # Dictionary to store when an object was fetched from the databse to determine the age\n", " self.cache_size_over_time = [] # To record cache state at each interval\n", " self.cache_next_request_over_time = []\n", " self.request_log = {i: [] for i in range(1, DATABASE_OBJECTS + 1)}\n", " self.hits = {i: 0 for i in range(1, DATABASE_OBJECTS + 1)} # Track hits per object\n", " self.misses = {i: 0 for i in range(1, DATABASE_OBJECTS + 1)} # Track misses per object\n", " self.cumulative_age = {i: 0 for i in range(1, DATABASE_OBJECTS + 1)} # Track cumulative age per object\n", " self.access_count = {i: 0 for i in range(1, DATABASE_OBJECTS + 1)} # Track access count per object\n", " self.next_refresh = {} # Track the next refresh time for each cached object\n", " self.object_start_time = {} # Used as helper variable to determine the starting time of an object in the cache\n", " self.cumulative_cache_time = {i: 0 for i in range(1, DATABASE_OBJECTS + 1)} # Stores the cumulative time the object has spent between its eviction and when it was first pulled into the cache\n", " \n", " def get(self, obj_id):\n", " if obj_id in self.storage and \\\n", " (self.ttl[obj_id] > env.now or CACHE_TTL == 0):\n", " # Cache hit: increment hit count and update cumulative age\n", " self.hits[obj_id] += 1\n", " self.cumulative_age[obj_id] += (env.now - self.initial_fetch[obj_id])\n", " self.access_count[obj_id] += 1\n", " else:\n", " # Cache miss: increment miss count\n", " self.misses[obj_id] += 1\n", " self.cumulative_age[obj_id] += 0\n", " self.access_count[obj_id] += 1\n", " self.initial_fetch[obj_id] = env.now\n", " self.object_start_time[obj_id] = env.now\n", " \n", " # Fetch the object from the database if it’s not in cache\n", " obj = self.db.get_object(obj_id)\n", " \n", " # If the cache is full, evict the oldest object\n", " if len(self.storage) > CACHE_CAPACITY:\n", " if self.cache_type == CacheType.LRU:\n", " self.evict_oldest()\n", " elif self.cache_type == CacheType.RANDOM_EVICTION:\n", " self.evict_random()\n", " \n", " # Add the object to cache, set TTL, reset age, and schedule next refresh\n", " self.storage[obj_id] = obj\n", " if CACHE_TTL != 0:\n", " self.ttl[obj_id] = env.now + CACHE_TTL\n", " else:\n", " self.ttl[obj_id] = 0\n", " if MAX_REFRESH_RATE != 0:\n", " self.next_refresh[obj_id] = env.now + np.random.exponential(1/self.db.mu_values[obj_id]) # Schedule refresh\n", "\n", " \n", " def evict_oldest(self):\n", " \"\"\"Remove the oldest item from the cache to make space.\"\"\"\n", " oldest_id = min(self.initial_fetch, key=self.initial_fetch.get) # Find the oldest item by age\n", " print(f\"[{env.now:.2f}] Cache: Evicting oldest object {oldest_id} to make space at {self.ttl[oldest_id]:.2f}\")\n", " del self.storage[oldest_id]\n", " del self.ttl[oldest_id]\n", " del self.initial_fetch[oldest_id]\n", "\n", " def evict_random(self):\n", " \"\"\"Remove a random item from the cache to make space.\"\"\"\n", " random_id = np.random.choice(list(self.storage.keys())) # Select a random key from the cache\n", " print(f\"[{env.now:.2f}] Cache: Evicting random object {random_id} to make space at {self.ttl[random_id]:.2f}\")\n", " del self.storage[random_id]\n", " del self.ttl[random_id]\n", " del self.initial_fetch[random_id]\n", " \n", " def refresh_object(self, obj_id):\n", " \"\"\"Refresh the object from the database to keep it up-to-date. TTL is increased on refresh.\"\"\"\n", " obj = self.db.get_object(obj_id)\n", " self.storage[obj_id] = obj\n", " if CACHE_TTL != 0:\n", " self.ttl[obj_id] = env.now + CACHE_TTL\n", " else:\n", " self.ttl[obj_id] = 0\n", " self.initial_fetch[obj_id] = env.now\n", " # print(f\"[{env.now:.2f}] Cache: Refreshed object {obj_id}\")\n", " \n", " def check_expired(self):\n", " \"\"\"Increment age of each cached object.\"\"\"\n", " for obj_id in list(self.ttl.keys()):\n", " # print(f\"[{env.now:.2f}] Cache: Object {obj_id} aged to {env.now-self.initial_fetch[obj_id]}\")\n", " if CACHE_TTL != 0 and self.ttl[obj_id] <= env.now:\n", " # Remove object if its TTL expired\n", " # print(f\"[{env.now:.2f}] Cache: Object {obj_id} expired\")\n", " self.cumulative_cache_time[obj_id] += (env.now - self.object_start_time[obj_id])\n", " del self.storage[obj_id]\n", " del self.ttl[obj_id]\n", " del self.initial_fetch[obj_id]\n", " del self.object_start_time[obj_id]\n", "\n", " \n", " def record_cache_state(self):\n", " \"\"\"Record the current cache state (number of objects in cache) over time.\"\"\"\n", " self.cache_size_over_time.append((env.now, len(self.storage)))\n", " self.cache_next_request_over_time.append((env.now, self.db.next_request.copy()))" ] }, { "cell_type": "code", "execution_count": 6, "id": "7286d498-aa6c-4efb-bb28-fe29736eab64", "metadata": {}, "outputs": [], "source": [ "def age_cache_process(env, cache):\n", " \"\"\"Process that ages cache objects over time, removes expired items, and refreshes based on object-specific intervals.\"\"\"\n", " last_full_second = 0\n", " while True:\n", " cache.check_expired() # Age objects and remove expired ones\n", "\n", " if MAX_REFRESH_RATE != 0:\n", " # Refresh objects based on their individual refresh intervals\n", " for obj_id in list(cache.storage.keys()):\n", " # Check if it's time to refresh this object based on next_refresh\n", " if env.now >= cache.next_refresh[obj_id]:\n", " cache.refresh_object(obj_id)\n", " # Schedule the next refresh based on the object's mu\n", " cache.next_refresh[obj_id] = env.now + np.random.exponential(1/cache.db.mu_values[obj_id])\n", " \n", " cache.record_cache_state() # Record cache state at each time step\n", " yield env.timeout(0.05) # Run every second" ] }, { "cell_type": "code", "execution_count": 7, "id": "687f5634-8edf-4337-b42f-bbb292d47f0f", "metadata": {}, "outputs": [], "source": [ "def client_request_process(env, cache, event):\n", " \"\"\"Client process that makes requests for objects from the cache.\"\"\"\n", " last_print = 0\n", " with tqdm(total=ACCESS_COUNT_LIMIT, desc=\"Progress\", leave=True) as pbar:\n", " while True:\n", " obj_id, next_request = min(cache.db.next_request.items(), key=lambda x: x[1])\n", " yield env.timeout(next_request - env.now)\n", " if (int(env.now) % 1) == 0 and int(env.now) != last_print:\n", " last_print = int(env.now)\n", " pbar.n = min(cache.access_count.values())\n", " pbar.refresh()\n", " if env.now >= next_request:\n", " # print(f\"[{env.now:.2f}] Client: Requesting object {obj_id}\")\n", " cache.get(obj_id)\n", " \n", " # print(f\"[{env.now:.2f}] Client: Schedule next request for {obj_id}\")\n", " next_request = env.now + np.random.exponential(1/cache.db.lambda_values[obj_id])\n", " cache.request_log[obj_id].append(next_request)\n", " cache.db.next_request[obj_id] = next_request\n", " if all(access_count >= ACCESS_COUNT_LIMIT for access_count in cache.access_count.values()):\n", " print(env.now)\n", " event.succeed()" ] }, { "cell_type": "code", "execution_count": 8, "id": "c8516830-9880-4d9e-a91b-000338baf9d6", "metadata": { "scrolled": true }, "outputs": [], "source": [ "# Initialize simulation environment\n", "env = simpy.Environment()\n", "\n", "# Instantiate components\n", "db = Database()\n", "cache = Cache(env, db, cache_type)\n", "stop_event = env.event()" ] }, { "cell_type": "code", "execution_count": 9, "id": "2ba34b36-9ed5-4996-9600-11dfd25d8e60", "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Progress: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉| 1999/2000 [00:10<00:00, 183.69it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "2114.009548152859\n", "CPU times: user 9.85 s, sys: 1.31 s, total: 11.2 s\n", "Wall time: 10.9 s\n" ] } ], "source": [ "%%time\n", "\n", "# Start processes\n", "env.process(age_cache_process(env, cache))\n", "env.process(client_request_process(env, cache, stop_event))\n", "\n", "# Run the simulation\n", "env.run(until=stop_event)\n", "simulation_end_time = env.now" ] }, { "cell_type": "code", "execution_count": 10, "id": "3b6f7c1f-ea54-4496-bb9a-370cee2d2751", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Object 1: Hit Rate = 0.83, Average Time spend in Cache: 0.81,Average Age = 2.07, Exprected Age = 0.35\n", "Object 2: Hit Rate = 0.94, Average Time spend in Cache: 0.87,Average Age = 2.32, Exprected Age = 0.44\n", "Object 3: Hit Rate = 0.84, Average Time spend in Cache: 0.82,Average Age = 2.08, Exprected Age = 0.35\n", "Object 4: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.10, Exprected Age = 0.35\n", "Object 5: Hit Rate = 0.91, Average Time spend in Cache: 0.87,Average Age = 2.26, Exprected Age = 0.41\n", "Object 6: Hit Rate = 0.83, Average Time spend in Cache: 0.81,Average Age = 2.09, Exprected Age = 0.35\n", "Object 7: Hit Rate = 0.96, Average Time spend in Cache: 0.87,Average Age = 2.40, Exprected Age = 0.46\n", "Object 8: Hit Rate = 0.84, Average Time spend in Cache: 0.82,Average Age = 2.07, Exprected Age = 0.35\n", "Object 9: Hit Rate = 0.83, Average Time spend in Cache: 0.81,Average Age = 2.03, Exprected Age = 0.35\n", "Object 10: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.04, Exprected Age = 0.35\n", "Object 11: Hit Rate = 0.91, Average Time spend in Cache: 0.89,Average Age = 2.26, Exprected Age = 0.41\n", "Object 12: Hit Rate = 0.84, Average Time spend in Cache: 0.81,Average Age = 2.04, Exprected Age = 0.35\n", "Object 13: Hit Rate = 0.84, Average Time spend in Cache: 0.81,Average Age = 2.10, Exprected Age = 0.35\n", "Object 14: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.07, Exprected Age = 0.34\n", "Object 15: Hit Rate = 0.91, Average Time spend in Cache: 0.86,Average Age = 2.25, Exprected Age = 0.41\n", "Object 16: Hit Rate = 0.91, Average Time spend in Cache: 0.87,Average Age = 2.28, Exprected Age = 0.42\n", "Object 17: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.01, Exprected Age = 0.35\n", "Object 18: Hit Rate = 0.83, Average Time spend in Cache: 0.80,Average Age = 2.13, Exprected Age = 0.35\n", "Object 19: Hit Rate = 0.94, Average Time spend in Cache: 0.87,Average Age = 2.32, Exprected Age = 0.44\n", "Object 20: Hit Rate = 0.83, Average Time spend in Cache: 0.80,Average Age = 2.04, Exprected Age = 0.35\n", "Object 21: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.07, Exprected Age = 0.35\n", "Object 22: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.09, Exprected Age = 0.35\n", "Object 23: Hit Rate = 0.84, Average Time spend in Cache: 0.81,Average Age = 2.08, Exprected Age = 0.35\n", "Object 24: Hit Rate = 0.91, Average Time spend in Cache: 0.88,Average Age = 2.28, Exprected Age = 0.41\n", "Object 25: Hit Rate = 0.84, Average Time spend in Cache: 0.80,Average Age = 2.08, Exprected Age = 0.35\n", "Object 26: Hit Rate = 0.84, Average Time spend in Cache: 0.81,Average Age = 2.07, Exprected Age = 0.35\n", "Object 27: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.15, Exprected Age = 0.35\n", "Object 28: Hit Rate = 0.96, Average Time spend in Cache: 0.86,Average Age = 2.41, Exprected Age = 0.46\n", "Object 29: Hit Rate = 0.83, Average Time spend in Cache: 0.81,Average Age = 2.08, Exprected Age = 0.35\n", "Object 30: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.07, Exprected Age = 0.35\n", "Object 31: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.06, Exprected Age = 0.34\n", "Object 32: Hit Rate = 0.95, Average Time spend in Cache: 0.86,Average Age = 2.36, Exprected Age = 0.45\n", "Object 33: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.12, Exprected Age = 0.35\n", "Object 34: Hit Rate = 0.95, Average Time spend in Cache: 0.87,Average Age = 2.37, Exprected Age = 0.45\n", "Object 35: Hit Rate = 0.84, Average Time spend in Cache: 0.81,Average Age = 2.05, Exprected Age = 0.35\n", "Object 36: Hit Rate = 0.83, Average Time spend in Cache: 0.83,Average Age = 2.02, Exprected Age = 0.34\n", "Object 37: Hit Rate = 0.84, Average Time spend in Cache: 0.82,Average Age = 2.05, Exprected Age = 0.35\n", "Object 38: Hit Rate = 0.94, Average Time spend in Cache: 0.87,Average Age = 2.36, Exprected Age = 0.44\n", "Object 39: Hit Rate = 0.98, Average Time spend in Cache: 0.76,Average Age = 2.44, Exprected Age = 0.48\n", "Object 40: Hit Rate = 0.83, Average Time spend in Cache: 0.79,Average Age = 2.07, Exprected Age = 0.34\n", "Object 41: Hit Rate = 0.95, Average Time spend in Cache: 0.85,Average Age = 2.38, Exprected Age = 0.45\n", "Object 42: Hit Rate = 0.95, Average Time spend in Cache: 0.86,Average Age = 2.37, Exprected Age = 0.45\n", "Object 43: Hit Rate = 0.91, Average Time spend in Cache: 0.88,Average Age = 2.24, Exprected Age = 0.41\n", "Object 44: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.04, Exprected Age = 0.34\n", "Object 45: Hit Rate = 0.83, Average Time spend in Cache: 0.83,Average Age = 2.11, Exprected Age = 0.35\n", "Object 46: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.12, Exprected Age = 0.35\n", "Object 47: Hit Rate = 0.98, Average Time spend in Cache: 0.78,Average Age = 2.45, Exprected Age = 0.48\n", "Object 48: Hit Rate = 0.83, Average Time spend in Cache: 0.81,Average Age = 2.14, Exprected Age = 0.35\n", "Object 49: Hit Rate = 0.83, Average Time spend in Cache: 0.81,Average Age = 2.12, Exprected Age = 0.35\n", "Object 50: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.06, Exprected Age = 0.35\n", "Object 51: Hit Rate = 0.96, Average Time spend in Cache: 0.87,Average Age = 2.41, Exprected Age = 0.46\n", "Object 52: Hit Rate = 0.98, Average Time spend in Cache: 0.81,Average Age = 2.46, Exprected Age = 0.48\n", "Object 53: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.06, Exprected Age = 0.35\n", "Object 54: Hit Rate = 0.83, Average Time spend in Cache: 0.81,Average Age = 2.05, Exprected Age = 0.34\n", "Object 55: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.09, Exprected Age = 0.34\n", "Object 56: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.07, Exprected Age = 0.34\n", "Object 57: Hit Rate = 0.84, Average Time spend in Cache: 0.83,Average Age = 2.07, Exprected Age = 0.35\n", "Object 58: Hit Rate = 0.99, Average Time spend in Cache: 0.68,Average Age = 2.46, Exprected Age = 0.49\n", "Object 59: Hit Rate = 0.91, Average Time spend in Cache: 0.87,Average Age = 2.23, Exprected Age = 0.41\n", "Object 60: Hit Rate = 0.84, Average Time spend in Cache: 0.81,Average Age = 2.07, Exprected Age = 0.35\n", "Object 61: Hit Rate = 0.99, Average Time spend in Cache: 0.57,Average Age = 2.47, Exprected Age = 0.49\n", "Object 62: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.07, Exprected Age = 0.34\n", "Object 63: Hit Rate = 0.83, Average Time spend in Cache: 0.81,Average Age = 2.08, Exprected Age = 0.35\n", "Object 64: Hit Rate = 0.91, Average Time spend in Cache: 0.87,Average Age = 2.27, Exprected Age = 0.41\n", "Object 65: Hit Rate = 0.84, Average Time spend in Cache: 0.81,Average Age = 2.06, Exprected Age = 0.35\n", "Object 66: Hit Rate = 0.98, Average Time spend in Cache: 0.78,Average Age = 2.46, Exprected Age = 0.48\n", "Object 67: Hit Rate = 0.84, Average Time spend in Cache: 0.81,Average Age = 2.05, Exprected Age = 0.35\n", "Object 68: Hit Rate = 1.00, Average Time spend in Cache: 0.29,Average Age = 2.49, Exprected Age = 0.50\n", "Object 69: Hit Rate = 0.83, Average Time spend in Cache: 0.81,Average Age = 2.04, Exprected Age = 0.34\n", "Object 70: Hit Rate = 0.83, Average Time spend in Cache: 0.83,Average Age = 2.06, Exprected Age = 0.35\n", "Object 71: Hit Rate = 0.91, Average Time spend in Cache: 0.84,Average Age = 2.25, Exprected Age = 0.41\n", "Object 72: Hit Rate = 0.83, Average Time spend in Cache: 0.81,Average Age = 2.09, Exprected Age = 0.35\n", "Object 73: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.10, Exprected Age = 0.35\n", "Object 74: Hit Rate = 0.84, Average Time spend in Cache: 0.82,Average Age = 2.06, Exprected Age = 0.35\n", "Object 75: Hit Rate = 0.94, Average Time spend in Cache: 0.88,Average Age = 2.31, Exprected Age = 0.44\n", "Object 76: Hit Rate = 0.91, Average Time spend in Cache: 0.86,Average Age = 2.28, Exprected Age = 0.41\n", "Object 77: Hit Rate = 0.91, Average Time spend in Cache: 0.87,Average Age = 2.25, Exprected Age = 0.42\n", "Object 78: Hit Rate = 0.94, Average Time spend in Cache: 0.88,Average Age = 2.32, Exprected Age = 0.44\n", "Object 79: Hit Rate = 0.99, Average Time spend in Cache: 0.71,Average Age = 2.46, Exprected Age = 0.49\n", "Object 80: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.10, Exprected Age = 0.35\n", "Object 81: Hit Rate = 0.83, Average Time spend in Cache: 0.80,Average Age = 2.06, Exprected Age = 0.34\n", "Object 82: Hit Rate = 0.96, Average Time spend in Cache: 0.85,Average Age = 2.41, Exprected Age = 0.46\n", "Object 83: Hit Rate = 0.91, Average Time spend in Cache: 0.87,Average Age = 2.32, Exprected Age = 0.41\n", "Object 84: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.05, Exprected Age = 0.35\n", "Object 85: Hit Rate = 0.83, Average Time spend in Cache: 0.82,Average Age = 2.06, Exprected Age = 0.35\n", "Object 86: Hit Rate = 0.91, Average Time spend in Cache: 0.86,Average Age = 2.28, Exprected Age = 0.41\n", "Object 87: Hit Rate = 0.84, Average Time spend in Cache: 0.82,Average Age = 2.09, Exprected Age = 0.35\n", "Object 88: Hit Rate = 0.91, Average Time spend in Cache: 0.86,Average Age = 2.24, Exprected Age = 0.41\n", "Object 89: Hit Rate = 0.83, Average Time spend in Cache: 0.81,Average Age = 2.04, Exprected Age = 0.35\n", "Object 90: Hit Rate = 0.84, Average Time spend in Cache: 0.81,Average Age = 2.08, Exprected Age = 0.35\n", "Object 91: Hit Rate = 0.91, Average Time spend in Cache: 0.88,Average Age = 2.26, Exprected Age = 0.41\n", "Object 92: Hit Rate = 0.91, Average Time spend in Cache: 0.84,Average Age = 2.28, Exprected Age = 0.41\n", "Object 93: Hit Rate = 0.94, Average Time spend in Cache: 0.89,Average Age = 2.38, Exprected Age = 0.44\n", "Object 94: Hit Rate = 0.83, Average Time spend in Cache: 0.81,Average Age = 2.09, Exprected Age = 0.34\n", "Object 95: Hit Rate = 0.91, Average Time spend in Cache: 0.87,Average Age = 2.25, Exprected Age = 0.41\n", "Object 96: Hit Rate = 0.83, Average Time spend in Cache: 0.81,Average Age = 2.04, Exprected Age = 0.35\n", "Object 97: Hit Rate = 0.83, Average Time spend in Cache: 0.81,Average Age = 2.08, Exprected Age = 0.35\n", "Object 98: Hit Rate = 0.99, Average Time spend in Cache: 0.47,Average Age = 2.48, Exprected Age = 0.49\n", "Object 99: Hit Rate = 0.95, Average Time spend in Cache: 0.86,Average Age = 2.38, Exprected Age = 0.45\n", "Object 100: Hit Rate = 0.91, Average Time spend in Cache: 0.87,Average Age = 2.26, Exprected Age = 0.41\n" ] } ], "source": [ "statistics = []\n", "# Calculate and print hit rate and average age for each object\n", "for obj_id in range(1, DATABASE_OBJECTS + 1):\n", " if cache.access_count[obj_id] != 0:\n", " hit_rate = cache.hits[obj_id] / max(1, cache.access_count[obj_id]) # Avoid division by zero\n", " avg_age = cache.cumulative_age[obj_id] / max(1, cache.access_count[obj_id])\n", " avg_cache_time = cache.cumulative_cache_time[obj_id] / max(1, simulation_end_time) # Only average over hits\n", " expected_age = (0.5*pow(hit_rate,2))\n", " print(f\"Object {obj_id}: Hit Rate = {hit_rate:.2f}, Average Time spend in Cache: {avg_cache_time:.2f},Average Age = {avg_age:.2f}, Exprected Age = {expected_age:.2f}\")\n", " statistics.append({\"obj_id\": obj_id,\"hit_rate\": hit_rate, \"avg_cache_time\":avg_cache_time, \"avg_age\": avg_age, \"expected_age\": expected_age})" ] }, { "cell_type": "code", "execution_count": 11, "id": "3f9f5442-dee5-4545-b7b0-6a716e9d943b", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "[{'obj_id': 1,\n", " 'hit_rate': 0.8343359555761222,\n", " 'avg_cache_time': {0.810432254071845},\n", " 'avg_age': 2.068923674198366,\n", " 'expected_age': 0.34805824338356045},\n", " {'obj_id': 2,\n", " 'hit_rate': 0.9368521766863339,\n", " 'avg_cache_time': {0.8697853571068594},\n", " 'avg_age': 2.3207402902916767,\n", " 'expected_age': 0.4388460004809609},\n", " {'obj_id': 3,\n", " 'hit_rate': 0.8387391502969392,\n", " 'avg_cache_time': {0.8200673629152411},\n", " 'avg_age': 2.083112933481689,\n", " 'expected_age': 0.3517416811204158},\n", " {'obj_id': 4,\n", " 'hit_rate': 0.8345864661654135,\n", " 'avg_cache_time': {0.817667207716411},\n", " 'avg_age': 2.098241838496266,\n", " 'expected_age': 0.3482672847532365},\n", " {'obj_id': 5,\n", " 'hit_rate': 0.9079009995240361,\n", " 'avg_cache_time': {0.8745472033792867},\n", " 'avg_age': 2.2637599890084745,\n", " 'expected_age': 0.41214211246837196},\n", " {'obj_id': 6,\n", " 'hit_rate': 0.8327790973871734,\n", " 'avg_cache_time': {0.8080445983334636},\n", " 'avg_age': 2.0885926647923605,\n", " 'expected_age': 0.3467605125224976},\n", " {'obj_id': 7,\n", " 'hit_rate': 0.9611706197398623,\n", " 'avg_cache_time': {0.8721183854707718},\n", " 'avg_age': 2.396789243995202,\n", " 'expected_age': 0.4619244801255555},\n", " {'obj_id': 8,\n", " 'hit_rate': 0.8350230414746543,\n", " 'avg_cache_time': {0.8224079743937736},\n", " 'avg_age': 2.0748384445301578,\n", " 'expected_age': 0.34863173989679114},\n", " {'obj_id': 9,\n", " 'hit_rate': 0.8310523831996225,\n", " 'avg_cache_time': {0.808204836664193},\n", " 'avg_age': 2.030852029418002,\n", " 'expected_age': 0.3453240318108861},\n", " {'obj_id': 10,\n", " 'hit_rate': 0.8308288899660689,\n", " 'avg_cache_time': {0.8177615771744638},\n", " 'avg_age': 2.0440294768985754,\n", " 'expected_age': 0.34513832220112506},\n", " {'obj_id': 11,\n", " 'hit_rate': 0.9088757396449704,\n", " 'avg_cache_time': {0.891248201160126},\n", " 'avg_age': 2.2625636303653898,\n", " 'expected_age': 0.413027555057596},\n", " {'obj_id': 12,\n", " 'hit_rate': 0.8373071528751753,\n", " 'avg_cache_time': {0.8102551278956152},\n", " 'avg_age': 2.0383876738470725,\n", " 'expected_age': 0.35054163412796613},\n", " {'obj_id': 13,\n", " 'hit_rate': 0.8361344537815126,\n", " 'avg_cache_time': {0.8105750271598551},\n", " 'avg_age': 2.0954043404028435,\n", " 'expected_age': 0.34956041240025426},\n", " {'obj_id': 14,\n", " 'hit_rate': 0.8290556900726392,\n", " 'avg_cache_time': {0.8201096214390584},\n", " 'avg_age': 2.0706796740450875,\n", " 'expected_age': 0.34366666862091},\n", " {'obj_id': 15,\n", " 'hit_rate': 0.908745247148289,\n", " 'avg_cache_time': {0.8605605035087328},\n", " 'avg_age': 2.2466123908950646,\n", " 'expected_age': 0.4129089621073024},\n", " {'obj_id': 16,\n", " 'hit_rate': 0.9110956360259982,\n", " 'avg_cache_time': {0.8747680644435698},\n", " 'avg_age': 2.2834548671334542,\n", " 'expected_age': 0.41504762899280906},\n", " {'obj_id': 17,\n", " 'hit_rate': 0.8320683111954459,\n", " 'avg_cache_time': {0.8150399870989544},\n", " 'avg_age': 2.0097170455667013,\n", " 'expected_age': 0.3461688372478207},\n", " {'obj_id': 18,\n", " 'hit_rate': 0.8342067651262506,\n", " 'avg_cache_time': {0.8032009912464316},\n", " 'avg_age': 2.1273968056684316,\n", " 'expected_age': 0.3479504634912017},\n", " {'obj_id': 19,\n", " 'hit_rate': 0.9354469684588985,\n", " 'avg_cache_time': {0.8651012574814502},\n", " 'avg_age': 2.3206810673715705,\n", " 'expected_age': 0.43753051539947174},\n", " {'obj_id': 20,\n", " 'hit_rate': 0.833976833976834,\n", " 'avg_cache_time': {0.7986061563297104},\n", " 'avg_age': 2.0432248271474878,\n", " 'expected_age': 0.34775867980501185},\n", " {'obj_id': 21,\n", " 'hit_rate': 0.8348837209302326,\n", " 'avg_cache_time': {0.8152281904411368},\n", " 'avg_age': 2.0677338592418755,\n", " 'expected_age': 0.3485154137371552},\n", " {'obj_id': 22,\n", " 'hit_rate': 0.8338068181818182,\n", " 'avg_cache_time': {0.8174427840452981},\n", " 'avg_age': 2.086382182099578,\n", " 'expected_age': 0.3476169050232438},\n", " {'obj_id': 23,\n", " 'hit_rate': 0.8357510528778662,\n", " 'avg_cache_time': {0.8057637380263669},\n", " 'avg_age': 2.0794074474530007,\n", " 'expected_age': 0.34923991119323095},\n", " {'obj_id': 24,\n", " 'hit_rate': 0.9097920074783828,\n", " 'avg_cache_time': {0.8768806713137},\n", " 'avg_age': 2.277444995774618,\n", " 'expected_age': 0.4138607484357729},\n", " {'obj_id': 25,\n", " 'hit_rate': 0.8363039399624765,\n", " 'avg_cache_time': {0.8033370429558485},\n", " 'avg_age': 2.0831638192632096,\n", " 'expected_age': 0.3497021399983808},\n", " {'obj_id': 26,\n", " 'hit_rate': 0.8382218148487626,\n", " 'avg_cache_time': {0.8105553974196054},\n", " 'avg_age': 2.0739601366722598,\n", " 'expected_age': 0.3513079054441766},\n", " {'obj_id': 27,\n", " 'hit_rate': 0.8346604215456674,\n", " 'avg_cache_time': {0.8174373373929206},\n", " 'avg_age': 2.1512142438129023,\n", " 'expected_age': 0.34832900964739566},\n", " {'obj_id': 28,\n", " 'hit_rate': 0.960876670191291,\n", " 'avg_cache_time': {0.8625135261787757},\n", " 'avg_age': 2.4084789355150056,\n", " 'expected_age': 0.4616419876589515},\n", " {'obj_id': 29,\n", " 'hit_rate': 0.8324705882352941,\n", " 'avg_cache_time': {0.8104802301710875},\n", " 'avg_age': 2.0824021086384605,\n", " 'expected_age': 0.3465036401384083},\n", " {'obj_id': 30,\n", " 'hit_rate': 0.8315191670610507,\n", " 'avg_cache_time': {0.8174875104134197},\n", " 'avg_age': 2.072225068112276,\n", " 'expected_age': 0.34571206259495174},\n", " {'obj_id': 31,\n", " 'hit_rate': 0.8260656540911318,\n", " 'avg_cache_time': {0.8153992880564279},\n", " 'avg_age': 2.061721077642618,\n", " 'expected_age': 0.3411922324345047},\n", " {'obj_id': 32,\n", " 'hit_rate': 0.952234570820525,\n", " 'avg_cache_time': {0.8556777555326739},\n", " 'avg_age': 2.3617840905668293,\n", " 'expected_age': 0.4533753389328747},\n", " {'obj_id': 33,\n", " 'hit_rate': 0.8347378277153558,\n", " 'avg_cache_time': {0.8177898808005426},\n", " 'avg_age': 2.1157873141297703,\n", " 'expected_age': 0.3483936205094755},\n", " {'obj_id': 34,\n", " 'hit_rate': 0.953300196509074,\n", " 'avg_cache_time': {0.8723919138738911},\n", " 'avg_age': 2.37152246660409,\n", " 'expected_age': 0.4543906323321196},\n", " {'obj_id': 35,\n", " 'hit_rate': 0.8371985157699443,\n", " 'avg_cache_time': {0.8056650949556616},\n", " 'avg_age': 2.0546440283833953,\n", " 'expected_age': 0.35045067740369884},\n", " {'obj_id': 36,\n", " 'hit_rate': 0.8293269230769231,\n", " 'avg_cache_time': {0.8321331411343728},\n", " 'avg_age': 2.019798753122858,\n", " 'expected_age': 0.3438915726701184},\n", " {'obj_id': 37,\n", " 'hit_rate': 0.8385178408051235,\n", " 'avg_cache_time': {0.820059027970993},\n", " 'avg_age': 2.0459185671323534,\n", " 'expected_age': 0.3515560846742432},\n", " {'obj_id': 38,\n", " 'hit_rate': 0.9372218690400509,\n", " 'avg_cache_time': {0.8698808303188571},\n", " 'avg_age': 2.3594967138941594,\n", " 'expected_age': 0.43919241590346314},\n", " {'obj_id': 39,\n", " 'hit_rate': 0.9754142169962586,\n", " 'avg_cache_time': {0.7626087843902165},\n", " 'avg_age': 2.4388237909562465,\n", " 'expected_age': 0.47571644735921215},\n", " {'obj_id': 40,\n", " 'hit_rate': 0.8275,\n", " 'avg_cache_time': {0.794355906656446},\n", " 'avg_age': 2.0686563554852295,\n", " 'expected_age': 0.34237812500000003},\n", " {'obj_id': 41,\n", " 'hit_rate': 0.9524259237398182,\n", " 'avg_cache_time': {0.845923081620667},\n", " 'avg_age': 2.3773225761537065,\n", " 'expected_age': 0.453557570105823},\n", " {'obj_id': 42,\n", " 'hit_rate': 0.9532319832888476,\n", " 'avg_cache_time': {0.8603717658690662},\n", " 'avg_age': 2.368518600216613,\n", " 'expected_age': 0.45432560698239494},\n", " {'obj_id': 43,\n", " 'hit_rate': 0.9076295585412668,\n", " 'avg_cache_time': {0.876926816727247},\n", " 'avg_age': 2.244802766787443,\n", " 'expected_age': 0.41189570776890744},\n", " {'obj_id': 44,\n", " 'hit_rate': 0.82810236600676,\n", " 'avg_cache_time': {0.8224668160130034},\n", " 'avg_age': 2.0368413613592855,\n", " 'expected_age': 0.34287676429299696},\n", " {'obj_id': 45,\n", " 'hit_rate': 0.8323863636363636,\n", " 'avg_cache_time': {0.8319088220634105},\n", " 'avg_age': 2.1104292351117517,\n", " 'expected_age': 0.3464335291838843},\n", " {'obj_id': 46,\n", " 'hit_rate': 0.8343443770415305,\n", " 'avg_cache_time': {0.8225991984196005},\n", " 'avg_age': 2.1195374144133803,\n", " 'expected_age': 0.3480652697504098},\n", " {'obj_id': 47,\n", " 'hit_rate': 0.980509111403344,\n", " 'avg_cache_time': {0.7793000913510133},\n", " 'avg_age': 2.4490817341548503,\n", " 'expected_age': 0.4806990587724876},\n", " {'obj_id': 48,\n", " 'hit_rate': 0.8343675417661098,\n", " 'avg_cache_time': {0.8080294162265821},\n", " 'avg_age': 2.136948776052968,\n", " 'expected_age': 0.3480845973764105},\n", " {'obj_id': 49,\n", " 'hit_rate': 0.8318116290245074,\n", " 'avg_cache_time': {0.8130078566363472},\n", " 'avg_age': 2.1232360998461477,\n", " 'expected_age': 0.3459552930902024},\n", " {'obj_id': 50,\n", " 'hit_rate': 0.8326159732185557,\n", " 'avg_cache_time': {0.817458050161407},\n", " 'avg_age': 2.055003674129556,\n", " 'expected_age': 0.3466246794293414},\n", " {'obj_id': 51,\n", " 'hit_rate': 0.9612454770519901,\n", " 'avg_cache_time': {0.8652760189728331},\n", " 'avg_age': 2.4115942850497527,\n", " 'expected_age': 0.46199643357645404},\n", " {'obj_id': 52,\n", " 'hit_rate': 0.9782768777614138,\n", " 'avg_cache_time': {0.8078795902330617},\n", " 'avg_age': 2.457015718981127,\n", " 'expected_age': 0.4785128247813101},\n", " {'obj_id': 53,\n", " 'hit_rate': 0.8317399617590823,\n", " 'avg_cache_time': {0.8224509800875742},\n", " 'avg_age': 2.0588664125261387,\n", " 'expected_age': 0.3458956819934998},\n", " {'obj_id': 54,\n", " 'hit_rate': 0.8293036750483559,\n", " 'avg_cache_time': {0.8081452701769272},\n", " 'avg_age': 2.053967188615532,\n", " 'expected_age': 0.34387229272435454},\n", " {'obj_id': 55,\n", " 'hit_rate': 0.828125,\n", " 'avg_cache_time': {0.8176938747650575},\n", " 'avg_age': 2.085346884674153,\n", " 'expected_age': 0.3428955078125},\n", " {'obj_id': 56,\n", " 'hit_rate': 0.8280565026790063,\n", " 'avg_cache_time': {0.8173220706448464},\n", " 'avg_age': 2.074950238616093,\n", " 'expected_age': 0.3428387858144936},\n", " {'obj_id': 57,\n", " 'hit_rate': 0.8393339333933393,\n", " 'avg_cache_time': {0.8270340728801309},\n", " 'avg_age': 2.0691955449482378,\n", " 'expected_age': 0.3522407258727672},\n", " {'obj_id': 58,\n", " 'hit_rate': 0.9883888888888889,\n", " 'avg_cache_time': {0.6768908831920782},\n", " 'avg_age': 2.4643101465551154,\n", " 'expected_age': 0.48845629783950617},\n", " {'obj_id': 59,\n", " 'hit_rate': 0.9093491124260356,\n", " 'avg_cache_time': {0.8748411466058176},\n", " 'avg_age': 2.2267777175980874,\n", " 'expected_age': 0.4134579041350093},\n", " {'obj_id': 60,\n", " 'hit_rate': 0.8384580082606701,\n", " 'avg_cache_time': {0.8104072319895872},\n", " 'avg_age': 2.0723452264510507,\n", " 'expected_age': 0.35150591580822493},\n", " {'obj_id': 61,\n", " 'hit_rate': 0.9923634975181367,\n", " 'avg_cache_time': {0.5747045857007451},\n", " 'avg_age': 2.472985486607898,\n", " 'expected_age': 0.49239265560321444},\n", " {'obj_id': 62,\n", " 'hit_rate': 0.8294685990338164,\n", " 'avg_cache_time': {0.8224411637289837},\n", " 'avg_age': 2.0655736147672212,\n", " 'expected_age': 0.3440090783915611},\n", " {'obj_id': 63,\n", " 'hit_rate': 0.8315939278937381,\n", " 'avg_cache_time': {0.8105502727907914},\n", " 'avg_age': 2.0794497864895076,\n", " 'expected_age': 0.3457742304548678},\n", " {'obj_id': 64,\n", " 'hit_rate': 0.9081364829396326,\n", " 'avg_cache_time': {0.865498922040767},\n", " 'avg_age': 2.2665026207308543,\n", " 'expected_age': 0.41235593582298274},\n", " {'obj_id': 65,\n", " 'hit_rate': 0.8366013071895425,\n", " 'avg_cache_time': {0.8129554073994908},\n", " 'avg_age': 2.0648277501716747,\n", " 'expected_age': 0.34995087359562566},\n", " {'obj_id': 66,\n", " 'hit_rate': 0.9804088183921069,\n", " 'avg_cache_time': {0.781811758702253},\n", " 'avg_age': 2.4642764008736737,\n", " 'expected_age': 0.48060072559050365},\n", " {'obj_id': 67,\n", " 'hit_rate': 0.839392544868845,\n", " 'avg_cache_time': {0.8057032348271645},\n", " 'avg_age': 2.0516174721394225,\n", " 'expected_age': 0.35228992219069794},\n", " {'obj_id': 68,\n", " 'hit_rate': 0.9971018872070984,\n", " 'avg_cache_time': {0.28694251969249696},\n", " 'avg_age': 2.4912476009423554,\n", " 'expected_age': 0.49710608673597856},\n", " {'obj_id': 69,\n", " 'hit_rate': 0.8279362010633156,\n", " 'avg_cache_time': {0.8104624011213533},\n", " 'avg_age': 2.044782938269008,\n", " 'expected_age': 0.34273917651557745},\n", " {'obj_id': 70,\n", " 'hit_rate': 0.8330975954738331,\n", " 'avg_cache_time': {0.827067381762729},\n", " 'avg_age': 2.061054243655572,\n", " 'expected_age': 0.3470258017921412},\n", " {'obj_id': 71,\n", " 'hit_rate': 0.9102174421323358,\n", " 'avg_cache_time': {0.8438498811202659},\n", " 'avg_age': 2.245598184286809,\n", " 'expected_age': 0.414247895980966},\n", " {'obj_id': 72,\n", " 'hit_rate': 0.8317490494296578,\n", " 'avg_cache_time': {0.8103677547984748},\n", " 'avg_age': 2.094107348921501,\n", " 'expected_age': 0.34590324061356964},\n", " {'obj_id': 73,\n", " 'hit_rate': 0.8348666053357866,\n", " 'avg_cache_time': {0.8222844065855565},\n", " 'avg_age': 2.097902145286362,\n", " 'expected_age': 0.34850112435245},\n", " {'obj_id': 74,\n", " 'hit_rate': 0.8388838883888389,\n", " 'avg_cache_time': {0.8223920952154627},\n", " 'avg_age': 2.059451157427686,\n", " 'expected_age': 0.35186308909918895},\n", " {'obj_id': 75,\n", " 'hit_rate': 0.936951316839585,\n", " 'avg_cache_time': {0.884020791397808},\n", " 'avg_age': 2.313501961216909,\n", " 'expected_age': 0.4389388850637162},\n", " {'obj_id': 76,\n", " 'hit_rate': 0.9075005990893842,\n", " 'avg_cache_time': {0.8603442007780137},\n", " 'avg_age': 2.278602079093859,\n", " 'expected_age': 0.4117786686737956},\n", " {'obj_id': 77,\n", " 'hit_rate': 0.9112534309240622,\n", " 'avg_cache_time': {0.8674652781940188},\n", " 'avg_age': 2.2542752448800436,\n", " 'expected_age': 0.4151914076854373},\n", " {'obj_id': 78,\n", " 'hit_rate': 0.9380210791253736,\n", " 'avg_cache_time': {0.8839771052976533},\n", " 'avg_age': 2.324935499962482,\n", " 'expected_age': 0.4399417724417652},\n", " {'obj_id': 79,\n", " 'hit_rate': 0.9867845598022438,\n", " 'avg_cache_time': {0.705585200712788},\n", " 'avg_age': 2.46010684921625,\n", " 'expected_age': 0.48687188373205403},\n", " {'obj_id': 80,\n", " 'hit_rate': 0.8322211630123928,\n", " 'avg_cache_time': {0.8177314370626462},\n", " 'avg_age': 2.097477368005882,\n", " 'expected_age': 0.3462960320828498},\n", " {'obj_id': 81,\n", " 'hit_rate': 0.8304836345872008,\n", " 'avg_cache_time': {0.8034749610214771},\n", " 'avg_age': 2.0624698657772527,\n", " 'expected_age': 0.3448515336585836},\n", " {'obj_id': 82,\n", " 'hit_rate': 0.9619305958282668,\n", " 'avg_cache_time': {0.8509832375052683},\n", " 'avg_age': 2.41091877839736,\n", " 'expected_age': 0.46265523559526217},\n", " {'obj_id': 83,\n", " 'hit_rate': 0.9100070307007265,\n", " 'avg_cache_time': {0.8722800197572179},\n", " 'avg_age': 2.3170644212278697,\n", " 'expected_age': 0.41405639796237653},\n", " {'obj_id': 84,\n", " 'hit_rate': 0.833254828073481,\n", " 'avg_cache_time': {0.8177016874896731},\n", " 'avg_age': 2.0464469902323,\n", " 'expected_age': 0.3471568042538831},\n", " {'obj_id': 85,\n", " 'hit_rate': 0.833255269320843,\n", " 'avg_cache_time': {0.8247840962323026},\n", " 'avg_age': 2.061285101346782,\n", " 'expected_age': 0.34715717192547535},\n", " {'obj_id': 86,\n", " 'hit_rate': 0.9074074074074074,\n", " 'avg_cache_time': {0.8555887732493566},\n", " 'avg_age': 2.2769598734065584,\n", " 'expected_age': 0.41169410150891633},\n", " {'obj_id': 87,\n", " 'hit_rate': 0.8397639582387654,\n", " 'avg_cache_time': {0.8224276969838862},\n", " 'avg_age': 2.0870135852266167,\n", " 'expected_age': 0.35260175277841943},\n", " {'obj_id': 88,\n", " 'hit_rate': 0.907762338284619,\n", " 'avg_cache_time': {0.8602891254952841},\n", " 'avg_age': 2.235994985739091,\n", " 'expected_age': 0.4120162314039796},\n", " {'obj_id': 89,\n", " 'hit_rate': 0.8307105388650453,\n", " 'avg_cache_time': {0.8080035927903887},\n", " 'avg_age': 2.035873238721567,\n", " 'expected_age': 0.34503999969072696},\n", " {'obj_id': 90,\n", " 'hit_rate': 0.8352996696554978,\n", " 'avg_cache_time': {0.8079407137714084},\n", " 'avg_age': 2.0794798223111317,\n", " 'expected_age': 0.3488627690632919},\n", " {'obj_id': 91,\n", " 'hit_rate': 0.9086402266288952,\n", " 'avg_cache_time': {0.8794285016730224},\n", " 'avg_age': 2.2588139685983926,\n", " 'expected_age': 0.41281353072410504},\n", " {'obj_id': 92,\n", " 'hit_rate': 0.9085754783841248,\n", " 'avg_cache_time': {0.841418447951084},\n", " 'avg_age': 2.2786416827720615,\n", " 'expected_age': 0.4127546999604706},\n", " {'obj_id': 93,\n", " 'hit_rate': 0.9372827804107425,\n", " 'avg_cache_time': {0.8936600617349919},\n", " 'avg_age': 2.378841722682071,\n", " 'expected_age': 0.4392495052272461},\n", " {'obj_id': 94,\n", " 'hit_rate': 0.8275355218030377,\n", " 'avg_cache_time': {0.8105095792801881},\n", " 'avg_age': 2.094877983310673,\n", " 'expected_age': 0.3424075199229129},\n", " {'obj_id': 95,\n", " 'hit_rate': 0.9085263912108908,\n", " 'avg_cache_time': {0.8700376807857447},\n", " 'avg_age': 2.2455942083568528,\n", " 'expected_age': 0.41271010176334233},\n", " {'obj_id': 96,\n", " 'hit_rate': 0.8329366968110423,\n", " 'avg_cache_time': {0.812733015130395},\n", " 'avg_age': 2.0386270901405714,\n", " 'expected_age': 0.3468917704472451},\n", " {'obj_id': 97,\n", " 'hit_rate': 0.83082158483228,\n", " 'avg_cache_time': {0.8084037771066447},\n", " 'avg_age': 2.0786109804084023,\n", " 'expected_age': 0.3451322529116107},\n", " {'obj_id': 98,\n", " 'hit_rate': 0.9946180888462768,\n", " 'avg_cache_time': {0.4651534320375863},\n", " 'avg_age': 2.4811043242858535,\n", " 'expected_age': 0.49463257133011007},\n", " {'obj_id': 99,\n", " 'hit_rate': 0.952843435525392,\n", " 'avg_cache_time': {0.8627920808474391},\n", " 'avg_age': 2.375694850086415,\n", " 'expected_age': 0.4539553063119159},\n", " {'obj_id': 100,\n", " 'hit_rate': 0.9087917254348848,\n", " 'avg_cache_time': {0.8674273959799007},\n", " 'avg_age': 2.2584215419035614,\n", " 'expected_age': 0.4129512001094576}]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "statistics" ] }, { "cell_type": "code", "execution_count": 12, "id": "b2d18372-cdba-4151-ae32-5bf45466bf94", "metadata": {}, "outputs": [], "source": [ "stats = pd.DataFrame(statistics)\n", "stats.to_csv(f\"{TEMP_BASE_DIR}/hit_age.csv\",index=False)\n", "stats.drop(\"obj_id\", axis=1).describe().to_csv(f\"{TEMP_BASE_DIR}/overall_hit_age.csv\")" ] }, { "cell_type": "code", "execution_count": 13, "id": "80971714-44f1-47db-9e89-85be7c885bde", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
| \n", " | access_count | \n", "hits | \n", "misses | \n", "mu | \n", "lambda | \n", "hit_rate | \n", "avg_age | \n", "expected_age | \n", "age_delta | \n", "
|---|---|---|---|---|---|---|---|---|---|
| 1 | \n", "2161 | \n", "1803 | \n", "358 | \n", "0 | \n", "1 | \n", "0.834336 | \n", "2.068924 | \n", "0.348058 | \n", "1.720865 | \n", "
| 2 | \n", "6271 | \n", "5875 | \n", "396 | \n", "0 | \n", "3 | \n", "0.936852 | \n", "2.320740 | \n", "0.438846 | \n", "1.881894 | \n", "
| 3 | \n", "2189 | \n", "1836 | \n", "353 | \n", "0 | \n", "1 | \n", "0.838739 | \n", "2.083113 | \n", "0.351742 | \n", "1.731371 | \n", "
| 4 | \n", "2128 | \n", "1776 | \n", "352 | \n", "0 | \n", "1 | \n", "0.834586 | \n", "2.098242 | \n", "0.348267 | \n", "1.749975 | \n", "
| 5 | \n", "4202 | \n", "3815 | \n", "387 | \n", "0 | \n", "2 | \n", "0.907901 | \n", "2.263760 | \n", "0.412142 | \n", "1.851618 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 96 | \n", "2101 | \n", "1750 | \n", "351 | \n", "0 | \n", "1 | \n", "0.832937 | \n", "2.038627 | \n", "0.346892 | \n", "1.691735 | \n", "
| 97 | \n", "2057 | \n", "1709 | \n", "348 | \n", "0 | \n", "1 | \n", "0.830822 | \n", "2.078611 | \n", "0.345132 | \n", "1.733479 | \n", "
| 98 | \n", "78225 | \n", "77804 | \n", "421 | \n", "0 | \n", "37 | \n", "0.994618 | \n", "2.481104 | \n", "0.494633 | \n", "1.986472 | \n", "
| 99 | \n", "8546 | \n", "8143 | \n", "403 | \n", "0 | \n", "4 | \n", "0.952843 | \n", "2.375695 | \n", "0.453955 | \n", "1.921740 | \n", "
| 100 | \n", "4254 | \n", "3866 | \n", "388 | \n", "0 | \n", "2 | \n", "0.908792 | \n", "2.258422 | \n", "0.412951 | \n", "1.845470 | \n", "
100 rows × 9 columns
\n", "