Created
November 22, 2019 12:36
-
-
Save kif/b47d4f9202b265fd95a07fc9db5104d4 to your computer and use it in GitHub Desktop.
Memcached client for Lima
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"ename": "ModuleNotFoundError", | |
"evalue": "No module named 'Lima'", | |
"output_type": "error", | |
"traceback": [ | |
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", | |
"\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", | |
"\u001b[0;32m<ipython-input-2-8933fadce3b0>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mLima\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", | |
"\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'Lima'" | |
] | |
} | |
], | |
"source": [ | |
"import Lima" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"ename": "ModuleNotFoundError", | |
"evalue": "No module named 'Lima'", | |
"output_type": "error", | |
"traceback": [ | |
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", | |
"\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", | |
"\u001b[0;32m<ipython-input-3-f0cddb6115ce>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mLima\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mCore\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", | |
"\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'Lima'" | |
] | |
} | |
], | |
"source": [ | |
"from Lima import Core" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from Lima import Basler" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import blosc" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"IP = \"192.168.5.19\"\n", | |
"fps = 30\n", | |
"EXPO = 0.001 #sec\n", | |
"scan = 0" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"ename": "Exception", | |
"evalue": "Hardware: Camera(/opt/conda/conda-bld/lima-camera-basler_1549640215705/work/src/BaslerCamera.cpp, 284): Error: Failed to discover GigE device '192.168.5.19:3956'", | |
"output_type": "error", | |
"traceback": [ | |
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", | |
"\u001b[0;31mException\u001b[0m Traceback (most recent call last)", | |
"\u001b[0;32m<ipython-input-6-f99c8f65ed8e>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mcam\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mBasler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mCamera\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mIP\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0miface\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mBasler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mInterface\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcam\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mctrl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mCtControl\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0miface\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0macq\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mctrl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macquisition\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0macq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msetAcqNbFrames\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;31mException\u001b[0m: Hardware: Camera(/opt/conda/conda-bld/lima-camera-basler_1549640215705/work/src/BaslerCamera.cpp, 284): Error: Failed to discover GigE device '192.168.5.19:3956'" | |
] | |
} | |
], | |
"source": [ | |
"cam = Basler.Camera(IP)\n", | |
"iface = Basler.Interface(cam)\n", | |
"ctrl = Core.CtControl(iface)\n", | |
"acq = ctrl.acquisition()\n", | |
"acq.setAcqNbFrames(0)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"<AcquisitionStatus=AcqRunning, ImageCounters=<LastImageAcquired=-1, LastBaseImageReady=-1, LastImageReady=-1, LastImageSaved=-1, LastCounterReady=-1>\n" | |
] | |
} | |
], | |
"source": [ | |
"ctrl.prepareAcq()\n", | |
"ctrl.startAcq()\n", | |
"print(ctrl.getStatus())\n", | |
"import time\n", | |
"time.sleep(1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"img = ctrl.ReadImage()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"779 µs ± 41.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n" | |
] | |
} | |
], | |
"source": [ | |
"%timeit len(blosc.compress(img.buffer.data, 2, shuffle=2, cname=\"lz4\"))/img.buffer.nbytes" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"4" | |
] | |
}, | |
"execution_count": 11, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"img.frameNumber" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([[ 76, 88, 72, ..., 93, 86, 87],\n", | |
" [ 65, 109, 66, ..., 83, 122, 70],\n", | |
" [ 77, 74, 71, ..., 80, 86, 90],\n", | |
" ...,\n", | |
" [127, 136, 122, ..., 126, 144, 138],\n", | |
" [138, 128, 130, ..., 140, 156, 152],\n", | |
" [134, 148, 128, ..., 157, 168, 157]], dtype=uint16)" | |
] | |
}, | |
"execution_count": 12, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"img.buffer" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<memory at 0x7f8ec5cd8120>" | |
] | |
}, | |
"execution_count": 13, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"img.buffer.data" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from collections import namedtuple\n", | |
"Id = namedtuple(\"Id\", \"beamline camera scan frame timestamp shape dtype comp\")\n", | |
"i=Id(\"id00\", \"basler\", 1, img.frameNumber, img.timestamp, img.buffer.shape, str(img.buffer.dtype), \"blosc\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"130" | |
] | |
}, | |
"execution_count": 15, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"len(str(i))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"\"Id(beamline='id00',camera='basler',scan=1,frame=4,timestamp=5.03251314163208,shape=(966,1296),dtype='uint16',comp='blosc')\"" | |
] | |
}, | |
"execution_count": 16, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"str(i).replace(\" \", \"\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Id(beamline='id00', camera='basler', scan=1, frame=11, timestamp=12.032986164093018, shape=(966, 1296), dtype='uint16', comp='blosc')" | |
] | |
}, | |
"execution_count": 17, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"\n", | |
"i=Id(\"id00\", \"basler\", 1, img.frameNumber, img.timestamp, img.buffer.shape, str(img.buffer.dtype), \"blosc\")\n", | |
"i" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import memcache\n", | |
"#client = memcache.Client(\"localhost\", 11211)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"class MemcachedSink(Core.Processlib.SinkTaskBase):\n", | |
" def __init__(self, server, port, compression=None):\n", | |
" \"\"\"\n", | |
" :param server_port: port to which to connect (can be a unix socket)\n", | |
" :param compression\n", | |
" \"\"\"\n", | |
" Core.Processlib.SinkTaskBase.__init__(self)\n", | |
" self.client = memcache.Client([(server, port)])\n", | |
" self.compression = compression\n", | |
"\n", | |
" def process(self, img) :\n", | |
" \"\"\"\n", | |
" Process a frame\n", | |
" \"\"\"\n", | |
" \n", | |
" i = Id(\"id00\", \"basler\", scan, img.frameNumber, img.timestamp, img.buffer.shape, str(img.buffer.dtype), self.compression)\n", | |
" if self.compression:\n", | |
" raw = blosc.compress(img.buffer.data, img.buffer.dtype.itemsize, shuffle=2, cname=\"lz4\")\n", | |
" else:\n", | |
" raw = img.buffer.to_bytes()\n", | |
" key = str(i).replace(\" \", \"\")\n", | |
" self.client.set(key, raw)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"<AcquisitionStatus=AcqRunning, ImageCounters=<LastImageAcquired=28, LastBaseImageReady=28, LastImageReady=28, LastImageSaved=-1, LastCounterReady=-1>\n" | |
] | |
} | |
], | |
"source": [ | |
"print(ctrl.getStatus())\n", | |
"ctrl.stopAcq()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"scan += 1 \n", | |
"extMgr = ctrl.externalOperation()\n", | |
"myOp = extMgr.addOp(Core.USER_SINK_TASK, \"memcached\", 0)\n", | |
"memcacheTask = MemcachedSink(\"localhost\", 11211, \"blosc\")\n", | |
"myOp.setSinkTask(memcacheTask)\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"<AcquisitionStatus=AcqRunning, ImageCounters=<LastImageAcquired=-1, LastBaseImageReady=-1, LastImageReady=-1, LastImageSaved=-1, LastCounterReady=-1>\n" | |
] | |
} | |
], | |
"source": [ | |
"acq = ctrl.acquisition()\n", | |
"acq.setAcqNbFrames(0)\n", | |
"acq.setAcqExpoTime(EXPO)\n", | |
"ctrl.prepareAcq()\n", | |
"ctrl.startAcq()\n", | |
"print(ctrl.getStatus())\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[('localhost:11211 (11211)',\n", | |
" {'5:chunk_size': '240',\n", | |
" '5:chunks_per_page': '4369',\n", | |
" '5:total_pages': '3',\n", | |
" '5:total_chunks': '13107',\n", | |
" '5:used_chunks': '11405',\n", | |
" '5:free_chunks': '1702',\n", | |
" '5:free_chunks_end': '0',\n", | |
" '5:mem_requested': '2637427',\n", | |
" '5:get_hits': '0',\n", | |
" '5:cmd_set': '0',\n", | |
" '5:delete_hits': '0',\n", | |
" '5:incr_hits': '0',\n", | |
" '5:decr_hits': '0',\n", | |
" '5:cas_hits': '0',\n", | |
" '5:cas_badval': '0',\n", | |
" '5:touch_hits': '0',\n", | |
" '37:chunk_size': '315872',\n", | |
" '37:chunks_per_page': '3',\n", | |
" '37:total_pages': '3802',\n", | |
" '37:total_chunks': '11406',\n", | |
" '37:used_chunks': '11405',\n", | |
" '37:free_chunks': '1',\n", | |
" '37:free_chunks_end': '0',\n", | |
" '37:mem_requested': '3481861680',\n", | |
" '37:get_hits': '0',\n", | |
" '37:cmd_set': '0',\n", | |
" '37:delete_hits': '0',\n", | |
" '37:incr_hits': '0',\n", | |
" '37:decr_hits': '0',\n", | |
" '37:cas_hits': '0',\n", | |
" '37:cas_badval': '0',\n", | |
" '37:touch_hits': '0',\n", | |
" '39:chunk_size': '524288',\n", | |
" '39:chunks_per_page': '2',\n", | |
" '39:total_pages': '5703',\n", | |
" '39:total_chunks': '11406',\n", | |
" '39:used_chunks': '11405',\n", | |
" '39:free_chunks': '1',\n", | |
" '39:free_chunks_end': '0',\n", | |
" '39:mem_requested': '5979504640',\n", | |
" '39:get_hits': '24004',\n", | |
" '39:cmd_set': '11416',\n", | |
" '39:delete_hits': '0',\n", | |
" '39:incr_hits': '0',\n", | |
" '39:decr_hits': '0',\n", | |
" '39:cas_hits': '0',\n", | |
" '39:cas_badval': '0',\n", | |
" '39:touch_hits': '0',\n", | |
" 'active_slabs': '3',\n", | |
" 'total_malloced': '9969860608'})]" | |
] | |
}, | |
"execution_count": 23, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"memcacheTask.client.get_stats(\"slabs\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 27, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"ctrl.stopAcq()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"memcacheTask.client.get(\"Id(beamline='id00',camera='basler',scan=1,frame=4149,timestamp=340.0730359554291,shape=(966,1296),dtype='uint16',comp='blosc')\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"memcacheTask.client.get(\"\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"memcacheTask.client.get_slab_stats()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"memcacheTask.client.get_stats(\"cachedump 39 10\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"memcacheTask.client.get(\"Id(beamline='id00',camera='basler',scan=1,frame=3836,timestamp=157.0424518585205,shape=(966,1296),dtype='uint16',comp='blosc')\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"memcacheTask.client.get_stats()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 24, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"img = ctrl.ReadImage()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([[25, 29, 24, ..., 18, 7, 14],\n", | |
" [25, 25, 24, ..., 17, 9, 18],\n", | |
" [12, 25, 21, ..., 8, 6, 15],\n", | |
" ...,\n", | |
" [30, 17, 27, ..., 21, 11, 12],\n", | |
" [28, 29, 27, ..., 10, 19, 16],\n", | |
" [26, 30, 16, ..., 12, 16, 11]], dtype=uint16)" | |
] | |
}, | |
"execution_count": 26, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"img.buffer" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"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.6.8" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment