Skip to content
Snippets Groups Projects
lec1.ipynb 9.71 KiB
Newer Older
TYLER CARAZA-HARTER's avatar
TYLER CARAZA-HARTER committed
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "34b260b6-a504-4cce-a9b3-a3566a8dbeb5",
   "metadata": {},
   "outputs": [],
   "source": [
    "import random\n",
    "import requests\n",
    "import pandas as pd\n",
    "\n",
    "r = requests.get(\"https://pages.cs.wisc.edu/~harter/cs544/data/wi-stations/stations.txt\")\n",
    "r.raise_for_status()\n",
    "stations = r.text.strip().split(\"\\n\")\n",
    "stations = random.sample(stations, k=10)\n",
    "workload = random.choices(stations, k=100, weights=[0.3, 0.2] + [0.5/8]*8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "c65f907c-049f-4110-a5ca-75772e76fdcf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(3.0)"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "np.quantile([1,2,4,5], 0.5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "e913b0fa-138c-4fb1-99df-738e79b7b5ad",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'US1WIIW0014 US1WIPC0020 USC00478805 US1WIBR0019 US1WIPC0020 US1WIBR0019 USC00474391 US1WIPC0020 USC00470062 USC00478805 US1WIBR0019 US1WIBR0019 US1WIIW0014 USC00478329 US1WIIW0014 US1WIBR0019 USC00478329 USC00470062 US1WIBR0019 USC00474391 US1WIMM0001 US1WIIW0014 US1WIBR0019 US1WIBR0019 US1WIMM0001 US1WIIW0014 US1WIBR0019 US1WIBR0019 USC00478805 US1WIIW0014 US1WIBR0019 US1WIIW0014 US1WIDG0011 US1WIIW0014 US1WIIW0014 US1WIDG0011 US1WIDG0011 USC00478805 US1WIIW0014 USC00478329 US1WIDG0011 US1WIBR0019 US1WIIW0014 US1WIIW0014 US1WIDG0011 USC00478805 USC00474391 US1WIBR0019 US1WIMM0001 USC00478329 US1WIBR0019 US1WIIW0014 US1WIPC0020 US1WIIW0014 US1WIBR0019 US1WIBR0019 USC00474391 US1WIBR0019 US1WIDG0011 US1WIVL0014 US1WIIW0014 US1WIIW0014 USC00478805 USC00470062 US1WIIW0014 USC00474391 US1WIBR0019 US1WIVL0014 US1WIIW0014 US1WIBR0019 USC00470062 US1WIBR0019 US1WIBR0019 US1WIPC0020 USC00478805 US1WIPC0020 USC00470062 USC00478329 US1WIPC0020 US1WIMM0001 USC00478329 USC00478329 USC00474391 US1WIBR0019 US1WIBR0019 USC00478805 USC00470062 US1WIIW0014 USC00470062 US1WIMM0001 US1WIBR0019 USC00474391 US1WIIW0014 US1WIPC0020 US1WIIW0014 US1WIIW0014 US1WIBR0019 US1WIBR0019 US1WIIW0014 US1WIPC0020'"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\" \".join(workload)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "3a66f04d-2361-4ca9-8556-d781d9e5b96c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1739200561.2493458"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import time\n",
    "time.time() # seconds since Jan 1, 1970"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "ed3e0c8a-6831-411c-b26c-2d14555127f0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2000.2596378326416"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "start = time.time()\n",
    "time.sleep(2)\n",
    "end = time.time()\n",
    "(end-start) * 1000 # milliseconds"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "508955f2-0071-4683-aae8-a8ddf8601570",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "miss miss miss miss hit hit miss miss miss miss miss hit miss miss hit hit hit miss miss miss miss miss miss hit hit hit hit hit miss hit hit hit miss miss hit hit hit hit hit miss hit miss hit hit miss miss miss miss miss miss hit miss miss hit miss hit miss hit miss miss miss hit miss miss hit miss miss miss miss hit miss miss hit miss miss hit miss miss miss miss hit hit miss miss hit miss miss miss hit miss miss miss miss miss hit hit miss hit hit hit "
     ]
    }
   ],
   "source": [
    "# Example 1: FIFO Policy\n",
    "\n",
    "cache_size = 3\n",
    "cache = {} # key=station name, value=DataFrame with weather data for that station\n",
    "evict_order = [] # evict from the left, try to keep whatever is on the right\n",
    "\n",
    "# stats\n",
    "hits = [] # 1 is a hit, 0 is a miss\n",
    "latency_ms = [] # latency of get_station in milliseconds\n",
    "\n",
    "def get_station(station):\n",
    "    start = time.time()\n",
    "    if station in cache:\n",
    "        hits.append(1)\n",
    "        print(\"hit\", end=\" \")\n",
    "        df = cache[station]\n",
    "    else:\n",
    "        hits.append(0)\n",
    "        print(\"miss\", end=\" \")\n",
    "        df = pd.read_csv(f\"https://pages.cs.wisc.edu/~harter/cs544/data/wi-stations/{station}.csv.gz\",\n",
    "                    names=[\"station\", \"date\", \"element\", \"value\", \"m\", \"q\", \"s\", \"obs\"], low_memory=False)\n",
    "        cache[station] = df\n",
    "        evict_order.append(station)\n",
    "        \n",
    "        if len(cache) > cache_size:\n",
    "            #print(\"evict!\")\n",
    "            victim = evict_order.pop(0)\n",
    "            cache.pop(victim)\n",
    "    #print(\"CACHE:\", evict_order)\n",
    "    end = time.time()\n",
    "    latency_ms.append((end-start)*1000)\n",
    "    return df\n",
    "\n",
    "for station in workload:\n",
    "    get_station(station)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "01d83645-241b-478c-9142-dde57d778b63",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Hits: 40\n",
      "Hit Rate: 0.4\n",
      "Avg Latency: 16.57418727874756\n",
      "Median Latency: 15.306830406188965\n",
      "p99 Latency: 93.56653213500977\n"
     ]
    }
   ],
   "source": [
    "print()\n",
    "print(\"Hits:\", sum(hits))\n",
    "print(\"Hit Rate:\", sum(hits) / len(hits))\n",
    "print(\"Avg Latency:\", sum(latency_ms) / len(latency_ms))\n",
    "print(\"Median Latency:\", np.quantile(latency_ms, 0.5))\n",
    "print(\"p99 Latency:\", np.quantile(latency_ms, 0.99))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "2f4e837c-da54-48f3-bd04-0465064c2df6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "miss miss miss miss hit hit miss hit miss miss miss hit miss miss hit hit hit miss hit miss miss miss miss hit hit hit hit hit miss hit hit hit miss hit hit hit hit miss hit miss miss miss miss hit hit miss miss miss miss miss hit miss miss hit hit hit miss hit miss miss miss hit miss miss hit miss miss miss miss hit miss hit hit miss miss hit miss miss hit miss hit hit miss miss hit miss miss miss hit miss miss miss miss miss hit hit miss hit hit hit "
     ]
    }
   ],
   "source": [
    "# Example 2: LRU Policy\n",
    "\n",
    "cache_size = 3\n",
    "cache = {} # key=station name, value=DataFrame with weather data for that station\n",
    "evict_order = [] # evict from the left, try to keep whatever is on the right\n",
    "\n",
    "# stats\n",
    "hits = [] # 1 is a hit, 0 is a miss\n",
    "latency_ms = [] # latency of get_station in milliseconds\n",
    "\n",
    "def get_station(station):\n",
    "    start = time.time()\n",
    "    if station in cache:\n",
    "        hits.append(1)\n",
    "        print(\"hit\", end=\" \")\n",
    "        df = cache[station]\n",
    "        evict_order.remove(station)\n",
    "        evict_order.append(station)\n",
    "    else:\n",
    "        hits.append(0)\n",
    "        print(\"miss\", end=\" \")\n",
    "        df = pd.read_csv(f\"https://pages.cs.wisc.edu/~harter/cs544/data/wi-stations/{station}.csv.gz\",\n",
    "                    names=[\"station\", \"date\", \"element\", \"value\", \"m\", \"q\", \"s\", \"obs\"], low_memory=False)\n",
    "        cache[station] = df\n",
    "        evict_order.append(station)\n",
    "        \n",
    "        if len(cache) > cache_size:\n",
    "            #print(\"evict!\")\n",
    "            victim = evict_order.pop(0)\n",
    "            cache.pop(victim)\n",
    "    #print(\"CACHE:\", evict_order)\n",
    "    end = time.time()\n",
    "    latency_ms.append((end-start)*1000)\n",
    "    return df\n",
    "\n",
    "for station in workload:\n",
    "    get_station(station)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "70dfb612-f83b-4d78-899d-afea29ea24de",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Hits: 44\n",
      "Hit Rate: 0.44\n",
      "Avg Latency: 16.295619010925293\n",
      "Median Latency: 15.197038650512695\n",
      "p99 Latency: 95.38349866867067\n"
     ]
    }
   ],
   "source": [
    "print()\n",
    "print(\"Hits:\", sum(hits))\n",
    "print(\"Hit Rate:\", sum(hits) / len(hits))\n",
    "print(\"Avg Latency:\", sum(latency_ms) / len(latency_ms))\n",
    "print(\"Median Latency:\", np.quantile(latency_ms, 0.5))\n",
    "print(\"p99 Latency:\", np.quantile(latency_ms, 0.99))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1afdfed8-d89b-4bc1-a0a7-688d751bc9c6",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}