Skip to content

Instantly share code, notes, and snippets.

@bmorris3
Last active August 13, 2024 18:55
Show Gist options
  • Save bmorris3/6f38f7c1d9906fb1c796a731ce5d2d66 to your computer and use it in GitHub Desktop.
Save bmorris3/6f38f7c1d9906fb1c796a731ce5d2d66 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "c3efbeb4-a641-40e9-a15a-097bc97f3115",
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"from time import time\n",
"from pathlib import Path\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib import ticker\n",
"\n",
"import boto3\n",
"from botocore import UNSIGNED\n",
"from botocore.config import Config\n",
"\n",
"# setup access to AWS S3 buckets without signing in: \n",
"config = Config(signature_version=UNSIGNED)\n",
"s3 = boto3.client('s3', config=config)"
]
},
{
"cell_type": "markdown",
"id": "d7a874d2-61a6-4c8e-8cd8-880c21abfe2b",
"metadata": {},
"source": [
"Download a bunch of small (~0.5 MB) Kepler light curve files:"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c3bcf1c4-07b9-459f-bc1f-b179a37f8d46",
"metadata": {},
"outputs": [],
"source": [
"# find all \"objects\" (files) in the Kepler lightcurves dir:\n",
"response = s3.list_objects_v2(\n",
" Bucket='stpubdata',\n",
" Prefix='kepler/public/lightcurves'\n",
")\n",
"\n",
"# grab the first N long cadence light curve files:\n",
"paths = [\n",
" content['Key'] for content in response['Contents'] \n",
" if content['Key'].endswith('_llc.fits')\n",
"][:100]\n",
"\n",
"download_dir = Path('downloads/')\n",
"os.makedirs(download_dir, exist_ok=True)\n",
"\n",
"all_start = time()\n",
"dt = np.zeros(len(paths))\n",
"mb = 2 ** 20\n",
"fs = dt.copy()\n",
"for i, key in enumerate(paths):\n",
" file_path = download_dir / Path(key).name\n",
" iter_start = time()\n",
" s3.download_file(Bucket=response['Name'], Key=key, Filename=file_path)\n",
" iter_stop = time()\n",
" dt[i] = iter_stop - iter_start\n",
" fs[i] = os.stat(file_path).st_size / mb\n",
"\n",
"all_stop = time()\n",
"\n",
"total_elapsed = all_stop - all_start\n",
"\n",
"print(f'{total_elapsed=:.2f}')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "cab32346-6287-49bf-8b59-d1d6a66f847b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.61 MB/s\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots()\n",
"ax.hist(fs / dt)\n",
"ax.set(\n",
" xlabel='download rate [MB/s]'\n",
")\n",
"\n",
"kepler_median_download_rate = np.median(fs / dt)\n",
"kepler_median_fs = np.median(fs)\n",
"print(f\"{kepler_median_download_rate:.2f} MB/s\")"
]
},
{
"cell_type": "markdown",
"id": "886aef61-72d1-467b-a2d6-844a68a83d3c",
"metadata": {},
"source": [
"Download a bunch of medium-sized (35 MB) TESS FFIs:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "abb4f431-895a-4994-ab7b-8641f3fbe1e7",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"total_elapsed=177.23\n"
]
}
],
"source": [
"# find all \"objects\" (files) in the TESS FFI dir:\n",
"response = s3.list_objects_v2(\n",
" Bucket='stpubdata',\n",
" Prefix='tess/public/ffi/s0060/2023/001/1-1/'\n",
")\n",
"\n",
"# grab the first N TESS FFI files:\n",
"paths = [\n",
" content['Key'] for content in response['Contents'] \n",
" if content['Key'].endswith('ffic.fits')\n",
"][:50]\n",
"\n",
"download_dir = Path('downloads/')\n",
"os.makedirs(download_dir, exist_ok=True)\n",
"\n",
"all_start = time()\n",
"dt = np.zeros(len(paths))\n",
"mb = 2 ** 20\n",
"fs = dt.copy()\n",
"for i, key in enumerate(paths):\n",
" file_path = download_dir / Path(key).name\n",
" iter_start = time()\n",
" s3.download_file(Bucket=response['Name'], Key=key, Filename=file_path)\n",
" iter_stop = time()\n",
" dt[i] = iter_stop - iter_start\n",
" fs[i] = os.stat(file_path).st_size / mb\n",
"\n",
"all_stop = time()\n",
"\n",
"total_elapsed = all_stop - all_start\n",
"\n",
"print(f'{total_elapsed=:.2f}')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "7b88dfb1-efee-43f1-88a3-dbecebc0b722",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"9.43 MB/s\n"
]
},
{
"data": {
"image/png": "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fvutex+//hkkqU+fPqd0nnr16lVn24wZM9SzZ0+1bNlSLVq00PPPP+8+1vFs2rRJ27ZtU0hIiFq0aKEWLVooPDxcR44c0ddff31Ks/xWy5YtlZycrDlz5mj27NlKTk7W+eefX+/aAQMGqKioSEVFRVq/fr0GDhyopKQk7dy5071m8eLFGjRokJo0+eV/aseMGaM777xTiYmJmjJlymnPCfg74gPwMV27dlV4eLhWrlzpER8rV65UQUGBqqur1bdvX4/n/PbSvcPhUG1t7Wkdv6qqSgMHDlRoaKjmzp2rgoICvfnmm5J02i9n/FpwcLDH/QULFujhhx/WHXfcoffee09FRUUaOXLkSY9VWVmpnj17ugPg2G3r1q267bbbTnu+UaNGac6cOcrNzdWoUaNO+HO0bdtWbdu21WWXXaYXX3xRVVVVeuGFF9xrlixZ4n6/h/TLS05ffPGFkpOT9cEHH6hz587ucwucTZraPQBwpmjTpo3OOeccrVu3zv3piP3792vr1q3uKwedOnXSzz//rHXr1rkDYt++fSouLlbnzp0l/RIOf/zjH7V48WJ98cUXuuKKK9S8eXO5XC4999xz6tWrV51f4A3RqVMnrVmzxmPbmjVr1L59ewUEBOirr77Svn37NGXKFMXGxkpSnTdFdurUqc6bWj/55JPTmmfNmjXq27ev7r33Xve2314RCAwMdF+VOaZHjx567bXX1KpVK4WGhp7Wsetz7D0jDodDAwcOPOXnORwONWnSxP1pmZKSEu3cuVPXXHONx7r27durffv2euihhzR06FDNnj1bN954o9fmB/wBVz4AL2nRooXuuOMOjR07Vh988IE+//xzjRgxwn3JXZLatWun1NRU3XXXXVq9erU2bdqk22+/XRdccIH7TYnSL3+YbP78+erevbtatGihJk2a6Morr9TcuXPdIXO6/va3v2nFihWaNGmStm7dqtzcXE2fPl0PP/ywJCkuLk6BgYF69tln9c0332jJkiWaNGmSxz7uuecelZSUaOzYsSouLta8efM83rDaEO3atdOGDRu0bNkybd26VdnZ2SooKPBYEx8fr88++0zFxcXau3evqqurNWzYMJ1//vlKTU3VRx99pO3btys/P18PPPCAvvvuu9OaRZICAgK0ZcsWffnllwoICDjuOpfLpbKyMpWVlWnLli26//77VVlZqZSUFEm/vOSSmJjofmPw4cOHdd999yk/P187d+7UmjVrVFBQoE6dOp32rIC/Ij4AL3ryySf1xz/+USkpKUpMTNQVV1yhnj17eqyZPXu2evbsqUGDBqlPnz6yLEtvv/22x0snV111lWpqajze29G/f/86205Hjx49tHDhQi1YsEAXX3yxxo8fr3/961/uT7O0bNlSc+bM0euvv67OnTtrypQpeuqppzz2ERcXpzfeeEN5eXnq1q2bZs2apccff/y05rn77rt100036dZbb1Xv3r21b98+j6sgknTXXXepQ4cO6tWrl1q2bKk1a9aoefPmWrVqleLi4nTTTTepU6dOuuOOO3TkyJHffSUkNDT0pPt49913FR0drejoaPXu3VsFBQV6/fXX3f98fv0RW+mXqNm3b5+GDx+u9u3bKy0tTUlJSZo4ceLvmhXwRw7Lsiy7hwAAE/Lz8zVgwADt37+/zh8Z86a9e/cqOjpa3333nSIjIxv03BEjRujAgQPKy8trnOEAH8CVDwBnndatW2vo0KGNtv+ffvpJTz/9dIPC46OPPlKLFi00d+7cRpsL8BVc+QBw1jh8+LC+//57Sb+8RycqKsrmif6fL88GeBvxAQAAjOJlFwAAYBTxAQAAjCI+AACAUcQHAAAwivgAAABGER8AAMAo4gMAABhFfAAAAKP+D93pKbqU1QQaAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots()\n",
"ax.hist(fs / dt)\n",
"ax.set(\n",
" xlabel='download rate [MB/s]'\n",
")\n",
"tess_median_download_rate = np.median(fs / dt)\n",
"tess_median_fs = np.median(fs)\n",
"\n",
"print(f\"{tess_median_download_rate:.2f} MB/s\")"
]
},
{
"cell_type": "markdown",
"id": "01d81f63-8ef6-46f2-a0c8-e355010711d6",
"metadata": {},
"source": [
"Download one large (2.8 GB) JWST NIRCam image:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "208e6eaa-4b1c-4092-bf71-cf4f5a91906b",
"metadata": {},
"outputs": [],
"source": [
"key = \"jwst/public/jw06626/jw06626007001/jw06626007001_05301_00001_nrcalong_dark.fits\"\n",
"file_path = download_dir / Path(key).name\n",
"iter_start = time()\n",
"s3.download_file(\n",
" Bucket=response['Name'], \n",
" Key=key, \n",
" Filename=file_path\n",
")\n",
"iter_stop = time()\n",
"dt = iter_stop - iter_start\n",
"fs = os.stat(file_path).st_size / mb"
]
},
{
"cell_type": "markdown",
"id": "90d14a7b-a651-41fe-8bcb-9e5be62790e5",
"metadata": {},
"source": [
"Plot the download rate as a function of the typical file size:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "589f3cd9-183e-4d1c-8d81-0bcd5f94d43e",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/pr/vdc0k4ys4f5527zyfbz5th8c0005g2/T/ipykernel_6785/1793971473.py:11: FutureWarning: `rcond` parameter will change to the default of machine precision times ``max(M, N)`` where M and N are the input matrix dimensions.\n",
"To use the future default and silence this warning we advise to pass `rcond=None`, to keep using the old, explicitly pass `rcond=-1`.\n",
" betas = np.linalg.lstsq(X, download_rate)[0]\n"
]
},
{
"data": {
"text/plain": [
"[Text(0.5, 0, 'File size [MB]'), Text(0, 0.5, 'Download rate [MB/s]')]"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x = np.geomspace(0.1, 5000, 50)\n",
"file_size_mb = np.array(\n",
" [kepler_median_fs, tess_median_fs, fs]\n",
")\n",
"download_rate = np.array(\n",
" [kepler_median_download_rate, tess_median_download_rate, fs/dt]\n",
")\n",
"\n",
"X = np.vander(np.log10(file_size_mb), 2)\n",
"betas = np.linalg.lstsq(X, download_rate)[0]\n",
"model = np.vander(np.log10(x), 2) @ betas\n",
"\n",
"ax = plt.gca()\n",
"ax.semilogx(file_size_mb, download_rate, 'o')\n",
"ax.semilogx(x, model)\n",
"ax.xaxis.set_major_formatter(ticker.ScalarFormatter())\n",
"ax.set(\n",
" xlabel='File size [MB]',\n",
" ylabel='Download rate [MB/s]'\n",
")"
]
},
{
"cell_type": "markdown",
"id": "2f8cf8ba-0a7a-4404-b46c-7eeb979db63c",
"metadata": {},
"source": [
"Plot the elapsed time to download 2 GB of data as a function of the size of the files it is broken across."
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "e67a03d0-7a0d-495d-869f-4e3ce1071f7f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[Text(0.5, 0, 'File size [MB]'), Text(0, 0.5, 'Total download time [min]')]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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NWvWeL1mf+auz2P16tUMGDCAkJCQqmuuueYatm3bxuHDh730bgKXgo5IAMvJyQGgefPm1Y43b9686px4jzOfR05ODnFxcdXOBwcHExsbq8/Mzdz1eeTk5NT6HKe/hniOgo6IiIj4LQUdkQAWHx8PQG5ubrXjubm5VefEe5z5POLj48nLy6t2/sSJExQUFOgzczN3fR7x8fG1PsfpryGeo6AjEsBSUlKIj49nyZIlVceKiopYs2YNffv2NbGywOTM59G3b1+OHDnCunXrqq5ZunQpdrudPn36eL1mf+auz6Nv374sX76c48ePV13zzTff0KFDB2JiYrz0bgJXsNkFiH8pLi5m586dVb9nZmayYcMGYmNjadWqlYmVBa5zfSb3338/f/7zn2nfvj0pKSk8/vjjJCYmMmrUKPOK9mPn+3l07NiRIUOGMHHiRF577TWOHz/Ovffey0033URiYqJJ78p3eePzuPnmm3nqqae48847efjhh9m8eTMvv/wyL730khlvOfCYPe1L/Mu3337rAGrcxo0bZ3ZpAetcn4ndbnc8/vjjjubNmztCQ0MdV155pWPbtm3mFu3H3PF5/PLLL47f/va3jsaNGzsiIyMdEyZMcBw9etSEd+P7vPV5bNy40dG/f39HaGioo0WLFo5nn33WW28x4FkcDofDu9FKRERExDs0RkdERET8loKOiIiI+C0FHREREfFbCjoiIiLitxR0RERExG8p6IiIiIjfUtARERERv6WgIyIiIn5LQUdE3OLyyy/n/vvvr/o9OTmZ2bNne+z1LBYLCxYs8NjzJycnY7FYsFgsHDlyxGOvAzB+/Piq1/LkexIJRAo6IuK007+QT7/t3LmTjz/+mD/96U9eqyU7O5uhQ4d69DWefvppsrOziYqKAiA9PR2LxUJMTAxlZWXVrl27dm3Vf49KlddX3sLDw+nUqRNvvPFGtce+/PLLZGdne/S9iAQqBR0RccmQIUPIzs6udktJSSE2NpaIiAiv1REfH09oaKhHXyMiIoL4+Phq4aXy+CeffFLt2D//+c8zbly7bds2srOz2bp1K3fddRf33HNPtR2xo6KiiI+Pd/8bEBEFHRFxTWhoKPHx8dVuQUFBNbqufu3IkSP87ne/o1mzZkRGRjJo0CA2btx4xusrKiq49957SUhIICwsjNatWzNjxoyq86d38zz55JO1tjS9+eabANjtdmbMmEFKSgrh4eF07dqVDz/8sM7/DcaNG8fcuXOrfj927Bjvvfce48aNq/X6uLg44uPjSUlJ4b777iMlJYX169fX+fVFxHkKOiLiFTfccAN5eXksXLiQdevW0aNHD6688koKCgpqvX7OnDl8+umnfPDBB2zbto13332X5OTkWq998MEHq7UwvfDCCzRs2JBevXoBMGPGDN566y1ee+01tmzZwgMPPMCtt97KsmXL6vRebrvtNlasWEFWVhYAH330EcnJyfTo0eOsj3M4HCxatIisrCz69OlTp9cWEdcEm12AiPiWzz//nMaNG1f9PnToUObPn3/Wx6xcuZKMjAzy8vKqupteeOEFFixYwIcffsikSZNqPCYrK4v27dvTv39/LBYLrVu3PuPzN27cuKqm7777jj/+8Y/MmzePiy66iPLycp555hkWL15M3759AWjTpg0rV67k9ddfZ+DAgS7/N4iLi2Po0KG8+eabPPHEE8ydO5c77rjjjNe3bNkSgPLycux2O08//TQDBgxw+XVFxHUKOiLikiuuuIJXX3216vdGjRqd8zEbN26kuLiYJk2aVDt+7Ngxdu3aVetjxo8fz1VXXUWHDh0YMmQIw4cP5+qrrz7r62RlZTFq1CgefPBBbrzxRgB27txJaWkpV111VbVrKyoq6N69+zlrP5M77riDKVOmcOutt7J69Wrmz5/PihUrar12xYoVREREUF5eTkZGBvfeey+xsbHcc889dX59EXGOgo6IuKRRo0a0a9fOpccUFxeTkJBAenp6jXPR0dG1PqZHjx5kZmaycOFCFi9ezI033sjgwYPPOLampKSEkSNH0rdvX55++ulqrw3wxRdf0KJFi2qPOZ/BzEOHDmXSpEnceeedjBgxokaIO11KSkrV++zUqRNr1qzhL3/5i4KOiBco6IiIx/Xo0YOcnByCg4PPOM6mNpGRkYwdO5axY8cyZswYhgwZQkFBAbGxsdWuczgc3Hrrrdjtdt5+++1qs6RSU1MJDQ0lKyurTt1UZxIcHMztt9/OzJkzWbhwoUuPDQoK4tixY26rRUTOTEFHRDxu8ODB9O3bl1GjRjFz5kwuuOACDh48yBdffMHo0aOrBg2fbtasWSQkJNC9e3esVivz588nPj6+1hagJ598ksWLF/P1119TXFxc1YoTFRVFREQEDz74IA888AB2u53+/ftTWFjIqlWriIyMPONMKWf86U9/4qGHHjpraw5AXl4eZWVlVV1Xb7/9NmPGjKnz64qI8xR0RMTjLBYLX375JY899hgTJkwgPz+f+Ph4BgwYQPPmzWt9TEREBDNnzmTHjh0EBQXRu3dvvvzyS6zWmpNFly1bRnFxMf369at2/F//+hfjx4/nT3/6E82aNWPGjBns3r2b6OhoevTowaOPPnpe7yskJISmTZue87oOHToARitQUlISd911F08++eR5vbaIOMficDgcZhchIlLfJCcnc//99591bSB3s1gsfPLJJ4waNcprryni77SOjojIGTz88MM0btyYwsJCj77O3XffXW3Kvoi4j1p0RERqsXfvXo4fPw4Y6+7U1mXmLnl5eRQVFQGQkJDg1JR9EXGOgo6IiIj4LXVdiYiIiN9S0BERERG/paAjIiIifktBR0RERPyWgo6IiIj4LQUdERER8VsKOiIiIuK3FHRERETEb/1/pnuVuswB90gAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plt.gca()\n",
"ax.loglog(file_size_mb, 2000 / np.array(download_rate) / 60, 'o')\n",
"elapsed_model = 2000 / model / 60\n",
"ax.semilogx(x, np.where(elapsed_model > 0, elapsed_model, np.nan))\n",
"ax.xaxis.set_major_formatter(ticker.ScalarFormatter())\n",
"ax.set(\n",
" xlabel='File size [MB]',\n",
" ylabel='Total download time [min]',\n",
" title='Elapsed time for 2 GB download'\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a4218357-d22d-4011-abd2-17ed9804b0b0",
"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.11.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment