{ "cells": [ { "cell_type": "markdown", "id": "c3ae20b5", "metadata": {}, "source": [ "# Multi-core bash" ] }, { "cell_type": "markdown", "id": "f8806b21", "metadata": {}, "source": [ "## Transform a simple \"for loop\" in multicore \"for loop\"\n", "**For Loop**\n", "\n", " [Recorded lecture: 1:46:50 - 2:08:50](https://youtu.be/Yy5UaCOvuYo?t=6410)\n", "\n", "\n", "You may run the full process by applying the loop in the usual way: " ] }, { "cell_type": "code", "execution_count": 12, "id": "7e61e807", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "geodata/LST/LST_MOYDmax_month1.tif\n", "Input file size is 1080, 840\n", "0...10...20...30...40...50...60...70...80...90...100 - done.\n", "geodata/LST/LST_MOYDmax_month2.tif\n", "Input file size is 1080, 840\n", "0...10...20...30...40...50...60...70...80...90...100 - done.\n", "geodata/LST/LST_MOYDmax_month3.tif\n", "Input file size is 1080, 840\n", "0...10...20...30...40...50...60...70...80...90...100 - done.\n", "geodata/LST/LST_MOYDmax_month4.tif\n", "Input file size is 1080, 840\n", "0...10...20...30...40...50...60...70...80...90...100 - done.\n", "geodata/LST/LST_MOYDmax_month5.tif\n", "Input file size is 1080, 840\n", "0...10...20...30...40...50...60...70...80...90...100 - done.\n", "geodata/LST/LST_MOYDmax_month6.tif\n", "Input file size is 1080, 840\n", "0...10...20...30...40...50...60...70...80...90...100 - done.\n", "geodata/LST/LST_MOYDmax_month7.tif\n", "Input file size is 1080, 840\n", "0...10...20...30...40...50...60...70...80...90...100 - done.\n", "geodata/LST/LST_MOYDmax_month8.tif\n", "Input file size is 1080, 840\n", "0...10...20...30...40...50...60...70...80...90...100 - done.\n", "geodata/LST/LST_MOYDmax_month9.tif\n", "Input file size is 1080, 840\n", "0...10...20...30...40...50...60...70...80...90...100 - done.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n", "real\t0m39.567s\n", "user\t0m33.485s\n", "sys\t0m4.028s\n" ] } ], "source": [ "%%bash \n", "cd /media/sf_LVM_shared/my_SE_data/exercise\n", "time (\n", " \n", "for file in geodata/LST/LST_MOYDmax_month?.tif; do\n", "echo $file\n", "filename=$(basename $file .tif)\n", "gdal_translate -co COMPRESS=DEFLATE -co ZLEVEL=9 -r average -tr 0.0008333333333333 0.0008333333333333 $file geodata/LST/${filename}_10k.tif\n", "done\n", "\n", ")" ] }, { "cell_type": "markdown", "id": "11766b6c", "metadata": {}, "source": [ "In this way only one processor will be used. The others will be just sleeping or eventually swap when the process is applied to another tif." ] }, { "cell_type": "code", "execution_count": 9, "id": "de805e72", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import Image\n", "Image(\"../images/xargs_core1.png\")" ] }, { "cell_type": "markdown", "id": "3e61d22f", "metadata": {}, "source": [ "**xargs loop - passing 1 argument**\n", "\n", "The xargs command allows to run a process splitting the task to several processors numerically defined by the user: " ] }, { "cell_type": "code", "execution_count": 11, "id": "6439c90c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Input file size is 1080, 840\n", "0Input file size is 1080, 840\n", "0......1010......20.20...30...30.....4040......5050......6060......70.70.....8080......9090......100 - done.\n", "100 - done.\n", "Input file size is 1080, 840\n", "0Input file size is 1080, 840\n", "0.....10..10.....20.20....30..30.....4040......5050......6060......7070.....80.80......9090......100 - done.\n", "100 - done.\n", "Input file size is 1080, 840\n", "0.Input file size is 1080, 840\n", "0....10...10...20...20..30..30......4040......5050......6060......70.70....80.80......9090......100 - done.\n", "Input file size is 1080, 840\n", "0...10100 - done.\n", "..Input file size is 1080, 840\n", "0..20....10.30......20...3040....40....50..50....60...60...70..70....80..80....90..90.....100 - done.\n", "Input file size is 1080, 840\n", "0...10.100 - done.\n", "..20...30...40...50...60...70...80...90...100 - done.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n", "real\t0m24.321s\n", "user\t0m36.641s\n", "sys\t0m3.390s\n" ] } ], "source": [ "%%bash\n", "cd /media/sf_LVM_shared/my_SE_data/exercise\n", "time (\n", "\n", "ls geodata/LST/LST_MOYDmax_month?.tif | xargs -n 1 -P 2 bash -c $'\n", "file=$1\n", "filename=$(basename $file .tif)\n", "gdal_translate -co COMPRESS=DEFLATE -co ZLEVEL=9 -r average -tr 0.0008333333333333 0.0008333333333333 $file geodata/LST/${filename}_10k.tif\n", "' _ \n", "\n", ")" ] }, { "cell_type": "markdown", "id": "3f79010b", "metadata": {}, "source": [ "- The -n option identifies the argument. The argument is the variable imported inside the loop.\n", "- The argument is identifies with \\\\$1 and for a better understanding renamed to file (file=\\\\$1).\n", "- The -P option identify the processors (in this case 2) used to run the full line inside -c $' ..... ' _\n", "\n", "For example, the following picture shows the processing time during the xargs loop. As you can see two processors are running simultaneously, and the whole processing time is shorter. " ] }, { "cell_type": "code", "execution_count": 14, "id": "077f420c", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import Image\n", "Image(\"../images/xargs_core2.png\")" ] }, { "cell_type": "markdown", "id": "ce3de20b", "metadata": {}, "source": [ "**xargs loop - passing 2 arguments**\n", "\n", "It also possible to pass more than one argument inside xargs. In this case we create a table with 2 columns: filename and resolution." ] }, { "cell_type": "code", "execution_count": 3, "id": "82bc675e", "metadata": {}, "outputs": [], "source": [ "%%bash \n", "for file in geodata/LST/LST_MOYDmax_month?.tif ; do \n", " for res in 0.0008 0.0010 ; do \n", " echo $file $res \n", " done\n", "done > geodata/LST/file_res.txt" ] }, { "cell_type": "code", "execution_count": 4, "id": "bd8d65f6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "geodata/LST/LST_MOYDmax_month1.tif 0.0008\n", "geodata/LST/LST_MOYDmax_month1.tif 0.0010\n", "geodata/LST/LST_MOYDmax_month2.tif 0.0008\n", "geodata/LST/LST_MOYDmax_month2.tif 0.0010\n", "geodata/LST/LST_MOYDmax_month3.tif 0.0008\n", "geodata/LST/LST_MOYDmax_month3.tif 0.0010\n", "geodata/LST/LST_MOYDmax_month4.tif 0.0008\n", "geodata/LST/LST_MOYDmax_month4.tif 0.0010\n", "geodata/LST/LST_MOYDmax_month5.tif 0.0008\n", "geodata/LST/LST_MOYDmax_month5.tif 0.0010\n", "geodata/LST/LST_MOYDmax_month6.tif 0.0008\n", "geodata/LST/LST_MOYDmax_month6.tif 0.0010\n", "geodata/LST/LST_MOYDmax_month7.tif 0.0008\n", "geodata/LST/LST_MOYDmax_month7.tif 0.0010\n", "geodata/LST/LST_MOYDmax_month8.tif 0.0008\n", "geodata/LST/LST_MOYDmax_month8.tif 0.0010\n", "geodata/LST/LST_MOYDmax_month9.tif 0.0008\n", "geodata/LST/LST_MOYDmax_month9.tif 0.0010\n" ] } ], "source": [ "cat geodata/LST/file_res.txt" ] }, { "cell_type": "markdown", "id": "d13943a3", "metadata": {}, "source": [ "Now the table is used to feed xargs" ] }, { "cell_type": "code", "execution_count": 5, "id": "469df016", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Input file size is 1080, 840\n", "0Input file size is 1080, 840\n", "0......1010.....20...20..30.....40.30...50....40.60......7050.....80....6090.....70...80...90....100 - done.\n", "Input file size is 1080, 840\n", "0...10...20...30...40...50...100 - done.\n", "Input file size is 1080, 840\n", "0...1060...20...30....40...50.....6070.....70...80..80.....90.90.....100 - done.\n", "Input file size is 1080, 840\n", "0...10..100 - done.\n", ".20.Input file size is 1080, 840\n", "0....30.10.....20...30....40...50.40...60.....5070......8060.....90...70...80...90....100 - done.\n", "Input file size is 1080, 840\n", "0...10...20...30...40...50100 - done.\n", ".Input file size is 1080, 840\n", "0....10...20...30....40...50.60..60......7070.....80...80..90....90....100 - done.\n", "Input file size is 1080, 840\n", "0...10...20...30...40100 - done.\n", "Input file size is 1080, 840\n", "0...10....20...30...40....50...50.60.....70...60..80.....7090.....80...90....100 - done.\n", "Input file size is 1080, 840\n", "0...10...20...30...40...100 - done.\n", "Input file size is 1080, 840\n", "0.50..10...20....30....40...50...60.60......7070......8080.....90...90....100 - done.\n", "Input file size is 1080, 840\n", "0...10...20...30..100 - done.\n", ".Input file size is 1080, 840\n", "0...10...2040...30...40...50.....60..50...70.....6080......90..70...80...90....100 - done.\n", "Input file size is 1080, 840\n", "0...10...20...30...40...50..100 - done.\n", ".Input file size is 1080, 840\n", "0...10...2060...30...40...50.....60..70....70...80..80.....90.90.....100 - done.\n", "Input file size is 1080, 840\n", "0.100 - done.\n", ".Input file size is 1080, 840\n", "0.10....10.....2020......30..30..40....50....6040......70..50..80.....6090.....70...80...90...100 - done.\n", ".100 - done.\n" ] } ], "source": [ "%%bash\n", "cd /media/sf_LVM_shared/my_SE_data/exercise\n", "\n", "cat geodata/LST/file_res.txt | xargs -n 2 -P 2 bash -c $'\n", "file=$1\n", "res=$2\n", "filename=$(basename $file .tif)\n", "gdal_translate -co COMPRESS=DEFLATE -co ZLEVEL=9 -r average -tr $res $res $file geodata/LST/${filename}_${res}.tif\n", "' _ \n" ] }, { "cell_type": "code", "execution_count": null, "id": "f95ff47c", "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.10.6" } }, "nbformat": 4, "nbformat_minor": 5 }