Skip to content

Instantly share code, notes, and snippets.

@monkeybutter
Created November 23, 2015 05:48
Show Gist options
  • Save monkeybutter/74514ba3e0f7367f612f to your computer and use it in GitHub Desktop.
Save monkeybutter/74514ba3e0f7367f612f to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Benchmark OpenDAP Server"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from random import randint, randrange\n",
"from datetime import timedelta, datetime\n",
"\n",
"def random_date(start, end):\n",
" delta = end - start\n",
" int_delta = (delta.days * 24 * 60 * 60) + delta.seconds\n",
" random_second = randrange(int_delta)\n",
" return start + timedelta(seconds=random_second)\n",
"\n",
"\n",
"def get_dap_url(year, month, day, hour, minut, band):\n",
" dap_ulr = ('http://dapds00.nci.org.au/thredds/dodsC/rr5/satellite/obs/himawari8/FLDK/' + \\\n",
" '{year:04d}/{month:02d}/{day:02d}/{hour:02d}{minut:02d}/{year:04d}{month:02d}{day:02d}{hour:02d}{minut:02d}' +\n",
" '00-P1S-ABOM_BRF_B{band:02d}-PRJ_GEOS141_2000-HIMAWARI8-AHI.nc').format(year=year, month=month, day=day,\n",
" hour=hour, minut=minut, band=band)\n",
"\n",
" return dap_ulr\n",
"\n",
"\n",
"def get_random_dap_url(band):\n",
" start = datetime(2015, 1, 1)\n",
" end = datetime.now()\n",
" rdate = random_date(start, end)\n",
" \n",
" return get_dap_url(rdate.year, rdate.month, rdate.day, \n",
" randint(0, 23), randint(0, 5)*10, band)\n",
"\n",
"def get_random_request(sq_extent, max_x=5499, max_y=5499): \n",
" \n",
" start = datetime(2015, 7, 7)\n",
" end = datetime.now() - timedelta(days=2)\n",
" rdate = random_date(start, end)\n",
" \n",
" band = randint(1, 3)\n",
" \n",
" dataset = get_dap_url(rdate.year, rdate.month, rdate.day, \n",
" randint(0, 23), randint(0, 5)*10, band)\n",
"\n",
" x0 = randint(0, max_x-sq_extent)\n",
" y0 = randint(0, max_y-sq_extent)\n",
" return dataset + '.ascii?channel_000{}_brf[0:1:0][{}:1:{}][{}:1:{}]'.format(band, x0, x0+sq_extent, \n",
" y0, y0+sq_extent)\n",
"\n",
"\n",
"def get_dap_request_list(number=100):\n",
" dap_urls = []\n",
" for i in range(number):\n",
" dap_urls.append(get_random_request(50))\n",
" \n",
" return dap_urls"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import concurrent.futures\n",
"import urllib.request\n",
"\n",
"# Retrieve a single page and report the url and contents\n",
"def load_url(url, timeout):\n",
" with urllib.request.urlopen(url, timeout=timeout) as conn:\n",
" return conn.read()\n",
"\n",
"\n",
"def conc(conc_level=10):# We can use a with statement to ensure threads are cleaned up promptly\n",
" \n",
" with concurrent.futures.ThreadPoolExecutor(max_workers=conc_level) as executor:\n",
" # Start the load operations and mark each future with its URL\n",
" future_to_url = {executor.submit(load_url, url, 60): url for url in get_dap_request_list(conc_level)}\n",
" for future in concurrent.futures.as_completed(future_to_url):\n",
" url = future_to_url[future]\n",
" try:\n",
" data = future.result()\n",
" except Exception as exc:\n",
" pass\n",
" #print('%r generated an exception: %s' % (url, exc))\n",
" else:\n",
" pass\n",
" #print('%r page is %d bytes' % (url, len(data)))\n",
" \n",
"def serial(conc_level=10):\n",
" for url in get_dap_request_list(conc_level):\n",
" data = load_url(url, 60)\n",
" print('%r page is %d bytes' % (url, len(data)))"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import timeit\n",
"\n",
"results = []\n",
"conc_levels = [1, 5, 10, 25, 50, 100, 200, 500, 1000]\n",
"conc_levels = [1, 5, 10, 25, 50, 100]\n",
"for conc_level in conc_levels:\n",
" timer = timeit.Timer('conc(level)', setup='level = {}; from __main__ import conc'.format(conc_level))\n",
" results.append(timer.repeat(10, 1))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import pandas as pd\n",
"\n",
"df = pd.DataFrame(list(map(list, zip(*results))), columns=conc_levels)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/pablo/anaconda/envs/python3/lib/python3.4/site-packages/matplotlib/__init__.py:892: UserWarning: axes.color_cycle is deprecated and replaced with axes.prop_cycle; please use the latter.\n",
" warnings.warn(self.msg_depr % (key, alt_key))\n"
]
},
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x10e2b5048>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10e207da0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"\n",
"plt.ylabel('Time [ms]', fontsize=16)\n",
"plt.xlabel('Concurrent Requests [#]', fontsize=16)\n",
"sns.violinplot(data=df)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.4.3"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment