{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Generating huge Mandelbrot fractals with Python, the quick and memory-safe way" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see how custom large generated images behave when working with blz and numba. For this purpose we are going to generate some Mandelbrot fractals directly to a blz container." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numba\n", "import numpy as np\n", "from pylab import show\n", "from time import time\n", "import blz\n", "from shutil import rmtree" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will be using the next code to generate the fractals." ] }, { "cell_type": "code", "collapsed": false, "input": [ "@numba.njit\n", "def mandel(x, y, max_iters):\n", " \"\"\"\n", " Given the real and imaginary parts of a complex number,\n", " determine if it is a candidate for membership in the Mandelbrot\n", " set given a fixed number of iterations.\n", " \"\"\"\n", " c = complex(x, y)\n", " z = 0.0j\n", " for i in xrange(max_iters):\n", " z = z*z + c\n", " if (z.real*z.real + z.imag*z.imag) >= 4:\n", " return i\n", "\n", " return max_iters\n", "\n", "\n", "def create_fractal(height, width, min_x, max_x, min_y, max_y, image, iters):\n", "\n", " pixel_size_x = (max_x - min_x) / width\n", " pixel_size_y = (max_y - min_y) / height\n", "\n", " for x in xrange(height):\n", "\n", " imag = min_y + x * pixel_size_y\n", "\n", " for y in xrange(width):\n", "\n", " real = min_x + y * pixel_size_x\n", " color = mandel(real, imag, iters)\n", " image[x, y] = color\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's generate a small fractal so we can se how it works." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "height = 1024\n", "width = 1536\n", "\n", "image = np.zeros((height, width), dtype=np.uint8)\n", "\n", "t1 = time()\n", "create_fractal(height, width, -2.0, 1.0, -1.0, 1.0, image, 20)\n", "t2 = time()\n", "\n", "elapsed1 = t2-t1\n", "print elapsed1\n", "imshow(image)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "2.01292991638\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 45, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 45 }, { "cell_type": "markdown", "metadata": {}, "source": [ "That was good but, what happens if I want to generate a really large fractal? Will I run out of memory? Sadly, the answer is yes.\n", "\n", "But this is where blz shines, can we modify the code so we generate the image directly to a blz container?\n", "Happily, the answer is yes." ] }, { "cell_type": "code", "collapsed": false, "input": [ "@numba.njit\n", "def mandel(x, y, max_iters):\n", " \"\"\"\n", " Given the real and imaginary parts of a complex number,\n", " determine if it is a candidate for membership in the Mandelbrot\n", " set given a fixed number of iterations.\n", " \"\"\"\n", " c = complex(x, y)\n", " z = 0.0j\n", " for i in xrange(max_iters):\n", " z = z*z + c\n", " if (z.real*z.real + z.imag*z.imag) >= 4:\n", " return i\n", "\n", " return max_iters\n", "\n", "\n", "def create_fractal(height, width, min_x, max_x, min_y, max_y, image, row, iters):\n", "\n", " pixel_size_x = (max_x - min_x) / width\n", " pixel_size_y = (max_y - min_y) / height\n", "\n", " for x in xrange(height):\n", "\n", " imag = min_y + x * pixel_size_y\n", "\n", " for y in xrange(width):\n", "\n", " real = min_x + y * pixel_size_x\n", " color = mandel(real, imag, iters)\n", " row[y] = color\n", "\n", " image.append(row)\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's take a look to the previous code, create_fractal now receives a new parameter 'row'. This parameter will allow us to generate a complete row and the append it to the disk blz, so we never run out of memory. This is a really fast method, way better than generating the whole blz and assigning values to the matrix." ] }, { "cell_type": "code", "collapsed": false, "input": [ "height = 1024\n", "width = 1536\n", "\n", "#If the blz already exist, remove it\n", "rmtree('images/Mandelbrot.blz', ignore_errors=True)\n", "\n", "image = blz.zeros((0, width), rootdir='images/Mandelbrot.blz', dtype=np.uint8,\n", " expectedlen=height*width,\n", " bparams=blz.bparams(clevel=9, shuffle=True, cname='zlib'))\n", "row = np.zeros((width), dtype=np.uint8)\n", "\n", "t1 = time()\n", "create_fractal(height, width, -2.0, 1.0, -1.0, 1.0, image, row, 20)\n", "t2 = time()\n", "\n", "image.flush()\n", "elapsed2 = t2-t1\n", "print elapsed2\n", "imshow(image)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "2.01285195351\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 47, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 47 }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see, it is as fast as the previous version and it doesn't eat our RAM." ] }, { "cell_type": "code", "collapsed": false, "input": [ "print str(elapsed1/elapsed2) + ' times faster'" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1.00003873254 times faster\n" ] } ], "prompt_number": 48 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have also compressed it." ] }, { "cell_type": "code", "collapsed": false, "input": [ "print 'Size in memory: %s' % image.nbytes\n", "print 'Size in disk: %s' % image.cbytes\n", "print 'Compress ratio: %f' % (float(image.nbytes)/float(image.cbytes))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Size in memory: 1572864\n", "Size in disk: 581160\n", "Compress ratio: 2.706422\n" ] } ], "prompt_number": 49 }, { "cell_type": "markdown", "metadata": {}, "source": [ "What if we want to generate a really big image? Let's try to generate a 30000x20000 Mandelbrot's fractal. This will take a while." ] }, { "cell_type": "code", "collapsed": false, "input": [ "height = 20000\n", "width = 30000\n", "\n", "#If the blz already exist, remove it\n", "rmtree('images/Mandelbrot.blz', ignore_errors=True)\n", "\n", "image = blz.zeros((0, width), rootdir='images/Mandelbrot.blz', dtype=np.uint8,\n", " expectedlen=height*width,\n", " bparams=blz.bparams(clevel=9, shuffle=True, cname='zlib'))\n", "row = np.zeros((width), dtype=np.uint8)\n", "\n", "t1 = time()\n", "create_fractal(height, width, -2.0, 1.0, -1.0, 1.0, image, row, 20)\n", "t2 = time()\n", "\n", "image.flush()\n", "elapsed3 = t2-t1\n", "print elapsed3" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "658.535179853\n" ] } ], "prompt_number": 52 }, { "cell_type": "code", "collapsed": false, "input": [ "print 'Size in memory: %s' % image.nbytes\n", "print 'Size in disk: %s' % image.cbytes\n", "print 'Compress ratio: %f' % (float(image.nbytes)/float(image.cbytes))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Size in memory: 600000000\n", "Size in disk: 4351807\n", "Compress ratio: 137.873761\n" ] } ], "prompt_number": 53 }, { "cell_type": "markdown", "metadata": {}, "source": [ "So we have just generated a 30000x20000 Mandelbrot's fractal that takes 572.2046 MiB of RAM, compressed and gotten a 4.2 MiB without using more than 100 MiB of RAM. That was pretty awesome." ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Conclusions" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "We can compute images as fast as with regular methods but we get compression and we don't run out of memory.\n", "\n", "blz is awesome, numba is awesome you should use them." ] } ], "metadata": {} } ] }