{"id":182521,"date":"2012-09-26T17:59:32","date_gmt":"2012-09-26T17:59:32","guid":{"rendered":"http:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=182521"},"modified":"2018-12-18T11:22:35","modified_gmt":"2018-12-18T19:22:35","slug":"multiprocessing-with-arcgis-approaches-and-considerations-part-1","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1","title":{"rendered":"Multiprocessing with ArcGIS \u2013 Approaches and Considerations (Part 1)"},"author":5121,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[23341],"tags":[31181,24321,24341],"industry":[],"product":[36991],"class_list":["post-182521","blog","type-blog","status-publish","format-standard","hentry","category-analytics","tag-arcpy","tag-geoprocessing","tag-python","product-arcgis-desktop"],"acf":{"short_description":"The multiprocessing Python module provides functionality for distributing work between multiple processes on a given machine.","flexible_content":[{"acf_fc_layout":"content","content":"<p>The\u00a0<em>multiprocessing<\/em>\u00a0Python module provides functionality for distributing work between multiple processes on a given machine, taking advantage of multiple CPU cores and larger amounts of available system memory. When analyzing or working with large amounts of data in ArcGIS, there are scenarios where multiprocessing can improve performance and scalability. However, there are many cases where multiprocessing can negatively affect performance, and even some instances where it should not be used.<br \/>\nThere are two approaches to using multiprocessing for improving performance or scalability:<\/p>\n<ol>\n<li>Processing many individual datasets.<\/li>\n<li>Processing datasets with many features.<\/li>\n<\/ol>\n<p>The goal of this article is to share simple coding patterns for effectively performing multiprocessing for geoprocessing. The article will cover relevant considerations and limitations, which are important when attempting to implement this approach.<\/p>\n<h2><strong>1. Processing large numbers of datasets<\/strong><\/h2>\n<p>The first example covers performing a specific operation on a large number of datasets, in a workspace or set of workspaces. In cases where there are large numbers of datasets, taking advantage of multiprocessing can help get the job done faster. The following code demonstrates a multiprocessing module used to define a projection, add a field, and calculate the field for a large list of shapefiles. This Python code is a simple pattern, which will create a pool of processes equal to the number of CPUs or CPU cores available. This pool of processes will then be used to processes the feature classes.<\/p>\n<div>\n<div id=\"highlighter_82624\" class=\"syntaxhighlighter python\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<div class=\"line number24 index23 alt1\">24<\/div>\n<div class=\"line number25 index24 alt2\">25<\/div>\n<div class=\"line number26 index25 alt1\">26<\/div>\n<div class=\"line number27 index26 alt2\">27<\/div>\n<div class=\"line number28 index27 alt1\">28<\/div>\n<div class=\"line number29 index28 alt2\">29<\/div>\n<div class=\"line number30 index29 alt1\">30<\/div>\n<div class=\"line number31 index30 alt2\">31<\/div>\n<div class=\"line number32 index31 alt1\">32<\/div>\n<div class=\"line number33 index32 alt2\">33<\/div>\n<div class=\"line number34 index33 alt1\">34<\/div>\n<div class=\"line number35 index34 alt2\">35<\/div>\n<div class=\"line number36 index35 alt1\">36<\/div>\n<div class=\"line number37 index36 alt2\">37<\/div>\n<div class=\"line number38 index37 alt1\">38<\/div>\n<div class=\"line number39 index38 alt2\">39<\/div>\n<div class=\"line number40 index39 alt1\">40<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"python keyword\">import<\/code> <code class=\"python plain\">os<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"python keyword\">import<\/code> <code class=\"python plain\">re<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"python keyword\">import<\/code> <code class=\"python plain\">multiprocessing<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"python keyword\">import<\/code> <code class=\"python plain\">arcpy<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"python keyword\">def<\/code> <code class=\"python plain\">update_shapefiles(shapefile):<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\">'''Worker function'''<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># Define the projection to wgs84 -- factory code is 4326.<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">arcpy.management.DefineProjection(shapefile, <\/code><code class=\"python value\">4326<\/code><code class=\"python plain\">)<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># Add a field named CITY of type TEXT.<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">arcpy.management.AddField(shapefile, <\/code><code class=\"python string\">'CITY'<\/code><code class=\"python plain\">, <\/code><code class=\"python string\">'TEXT'<\/code><code class=\"python plain\">)<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># Calculate field 'CITY' stripping '_base' from<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># the shapefile name.<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">city_name <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">shapefile.split(<\/code><code class=\"python string\">'_base'<\/code><code class=\"python plain\">)[<\/code><code class=\"python value\">0<\/code><code class=\"python plain\">]<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">city_name <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">re.sub(<\/code><code class=\"python string\">'_'<\/code><code class=\"python plain\">, <\/code><code class=\"python string\">' '<\/code><code class=\"python plain\">, city_name)<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">arcpy.management.CalculateField(shapefile, <\/code><code class=\"python string\">'CITY'<\/code><code class=\"python plain\">,<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python string\">'\"{0}\"'<\/code><code class=\"python plain\">.<\/code><code class=\"python functions\">format<\/code><code class=\"python plain\">(city_name.upper()), <\/code><code class=\"python string\">'PYTHON'<\/code><code class=\"python plain\">)<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"python comments\"># End update_shapefiles<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"python keyword\">def<\/code> <code class=\"python plain\">main():<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\">''' Create a pool class and run the jobs.'''<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># The number of jobs is equal to the number of shapefiles<\/code><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">workspace <\/code><code class=\"python keyword\">=<\/code> <code class=\"python string\">'C:\/GISData\/USA\/usa'<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">arcpy.env.workspace <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">workspace<\/code><\/div>\n<div class=\"line number28 index27 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">fcs <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">arcpy.ListFeatureClasses(<\/code><code class=\"python string\">'*'<\/code><code class=\"python plain\">)<\/code><\/div>\n<div class=\"line number29 index28 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">fc_list <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">[os.path.join(workspace, fc) <\/code><code class=\"python keyword\">for<\/code> <code class=\"python plain\">fc <\/code><code class=\"python keyword\">in<\/code> <code class=\"python plain\">fcs]<\/code><\/div>\n<div class=\"line number30 index29 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">pool <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">multiprocessing.Pool()<\/code><\/div>\n<div class=\"line number31 index30 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">pool.<\/code><code class=\"python functions\">map<\/code><code class=\"python plain\">(update_shapefiles, fc_list)<\/code><\/div>\n<div class=\"line number32 index31 alt1\"><\/div>\n<div class=\"line number33 index32 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># Synchronize the main process with the job processes to<\/code><\/div>\n<div class=\"line number34 index33 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># ensure proper cleanup.<\/code><\/div>\n<div class=\"line number35 index34 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">pool.close()<\/code><\/div>\n<div class=\"line number36 index35 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">pool.join()<\/code><\/div>\n<div class=\"line number37 index36 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># End main<\/code><\/div>\n<div class=\"line number38 index37 alt1\"><\/div>\n<div class=\"line number39 index38 alt2\"><code class=\"python keyword\">if<\/code> <code class=\"python plain\">__name__ <\/code><code class=\"python keyword\">=<\/code><code class=\"python keyword\">=<\/code> <code class=\"python string\">'__main__'<\/code><code class=\"python plain\">:<\/code><\/div>\n<div class=\"line number40 index39 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">main()<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2><strong>2. Processing a individual dataset with a lot of features and records<\/strong><\/h2>\n<p>This second example looks at Geoprocessing tools analyzing on an individual dataset with a lot of features and records. In this situation we can benefit from multiprocessing, by splitting data into groups to be processed simultaneously.<\/p>\n<div>\n<div>\n<dl>\n<dt><a href=\"http:\/\/betablogs.esri.com\/beta\/arcgis\/files\/2011\/08\/Fishnet_points2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/betablogs.esri.com\/beta\/arcgis\/files\/2011\/08\/Fishnet_points2-300x300.png\" alt=\"\" width=\"240\" height=\"240\" \/><\/a><\/dt>\n<dd>Figure 1: A fishnet of polygons covering the extent of one million points<\/dd>\n<\/dl>\n<\/div>\n<\/div>\n<p>For example, finding identical features may be faster when you split a large feature class into groups, based on spatial extents.<br \/>\nThe following code uses a pre-defined fishnet of polygons covering the extent of 1 million points (Figure 1).<\/p>\n<div>\n<div id=\"highlighter_391578\" class=\"syntaxhighlighter python\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<div class=\"line number24 index23 alt1\">24<\/div>\n<div class=\"line number25 index24 alt2\">25<\/div>\n<div class=\"line number26 index25 alt1\">26<\/div>\n<div class=\"line number27 index26 alt2\">27<\/div>\n<div class=\"line number28 index27 alt1\">28<\/div>\n<div class=\"line number29 index28 alt2\">29<\/div>\n<div class=\"line number30 index29 alt1\">30<\/div>\n<div class=\"line number31 index30 alt2\">31<\/div>\n<div class=\"line number32 index31 alt1\">32<\/div>\n<div class=\"line number33 index32 alt2\">33<\/div>\n<div class=\"line number34 index33 alt1\">34<\/div>\n<div class=\"line number35 index34 alt2\">35<\/div>\n<div class=\"line number36 index35 alt1\">36<\/div>\n<div class=\"line number37 index36 alt2\">37<\/div>\n<div class=\"line number38 index37 alt1\">38<\/div>\n<div class=\"line number39 index38 alt2\">39<\/div>\n<div class=\"line number40 index39 alt1\">40<\/div>\n<div class=\"line number41 index40 alt2\">41<\/div>\n<div class=\"line number42 index41 alt1\">42<\/div>\n<div class=\"line number43 index42 alt2\">43<\/div>\n<div class=\"line number44 index43 alt1\">44<\/div>\n<div class=\"line number45 index44 alt2\">45<\/div>\n<div class=\"line number46 index45 alt1\">46<\/div>\n<div class=\"line number47 index46 alt2\">47<\/div>\n<div class=\"line number48 index47 alt1\">48<\/div>\n<div class=\"line number49 index48 alt2\">49<\/div>\n<div class=\"line number50 index49 alt1\">50<\/div>\n<div class=\"line number51 index50 alt2\">51<\/div>\n<div class=\"line number52 index51 alt1\">52<\/div>\n<div class=\"line number53 index52 alt2\">53<\/div>\n<div class=\"line number54 index53 alt1\">54<\/div>\n<div class=\"line number55 index54 alt2\">55<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"python keyword\">import<\/code> <code class=\"python plain\">multiprocessing<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"python keyword\">import<\/code> <code class=\"python plain\">numpy<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"python keyword\">import<\/code> <code class=\"python plain\">arcpy<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"python plain\">arcpy.env.overwriteOutput <\/code><code class=\"python keyword\">=<\/code> <code class=\"python color1\">True<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"python keyword\">def<\/code> <code class=\"python plain\">find_identical(oid):<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\">'''Worker function to perform Find Identical, and return'''<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\">'''a list of numpy arrays as the results.'''<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># Create a feature layer for the tile in the fishnet.<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">tile <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">arcpy.management.MakeFeatureLayer(<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python string\">'C:\/testing\/testing.gdb\/fishnet'<\/code><code class=\"python plain\">,<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python string\">'layer{0}'<\/code><code class=\"python plain\">.<\/code><code class=\"python functions\">format<\/code><code class=\"python plain\">(oid[<\/code><code class=\"python value\">0<\/code><code class=\"python plain\">]), <\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\">\"\"\"OID = {0}\"\"\"<\/code><code class=\"python plain\">.<\/code><code class=\"python functions\">format<\/code><code class=\"python plain\">((oid[<\/code><code class=\"python value\">0<\/code><code class=\"python plain\">])))<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># Get the extent of the feature layer and set the environment<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># to use during Find Identical.<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">tile_row <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">arcpy.da.SearchCursor(tile, <\/code><code class=\"python string\">'shape@'<\/code><code class=\"python plain\">)<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">geometry <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">tile_row.<\/code><code class=\"python functions\">next<\/code><code class=\"python plain\">()[<\/code><code class=\"python value\">0<\/code><code class=\"python plain\">]<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">arcpy.env.extent <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">geometry.extent<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># Execute Find Identical<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">identical_table <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">arcpy.management.FindIdentical(<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python string\">'C:\/testing\/testing.gdb\/Points'<\/code><code class=\"python plain\">, <\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python string\">'in_memory\/identical'<\/code><code class=\"python plain\">, <\/code><code class=\"python string\">'Shape'<\/code><code class=\"python plain\">)<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># Convert the resulting table into a numpy array and return<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">result_array <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">arcpy.da.TableToNumPyArray(identical_table, [<\/code><code class=\"python string\">\"*\"<\/code><code class=\"python plain\">])<\/code><\/div>\n<div class=\"line number28 index27 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python keyword\">return<\/code> <code class=\"python plain\">result_array<\/code><\/div>\n<div class=\"line number29 index28 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># End find_identical<\/code><\/div>\n<div class=\"line number30 index29 alt1\"><\/div>\n<div class=\"line number31 index30 alt2\"><code class=\"python keyword\">def<\/code> <code class=\"python plain\">main():<\/code><\/div>\n<div class=\"line number32 index31 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># Create a list of OID's used to chunk the inputs<\/code><\/div>\n<div class=\"line number33 index32 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">fishnet_rows <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">arcpy.SearchCursor(<\/code><\/div>\n<div class=\"line number34 index33 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python string\">'C:\/testing\/testing.gdb\/fishnet'<\/code><code class=\"python plain\">, '<\/code><code class=\"python string\">', '<\/code><code class=\"python string\">', '<\/code><code class=\"python plain\">OID')<\/code><\/div>\n<div class=\"line number35 index34 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">oids <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">[[row.getValue(<\/code><code class=\"python string\">'OID'<\/code><code class=\"python plain\">)] <\/code><code class=\"python keyword\">for<\/code> <code class=\"python plain\">row <\/code><code class=\"python keyword\">in<\/code> <code class=\"python plain\">fishnet_rows]<\/code><\/div>\n<div class=\"line number36 index35 alt1\"><\/div>\n<div class=\"line number37 index36 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># Create a pool class and run the jobs--<\/code><\/div>\n<div class=\"line number38 index37 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># the number of jobs is equal to the length of the oids list<\/code><\/div>\n<div class=\"line number39 index38 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">pool <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">multiprocessing.Pool()<\/code><\/div>\n<div class=\"line number40 index39 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">result_arrays <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">pool.<\/code><code class=\"python functions\">map<\/code><code class=\"python plain\">(find_identical, oids)<\/code><\/div>\n<div class=\"line number41 index40 alt2\"><\/div>\n<div class=\"line number42 index41 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># Concatenate the resulting arrays and create an output table<\/code><\/div>\n<div class=\"line number43 index42 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># reporting any identical records.<\/code><\/div>\n<div class=\"line number44 index43 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">result_array <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">numpy.concatenate(result_arrays,axis<\/code><code class=\"python keyword\">=<\/code><code class=\"python value\">0<\/code><code class=\"python plain\">)<\/code><\/div>\n<div class=\"line number45 index44 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">arcpy.da.NumPyArrayToTable(result_array, <\/code><\/div>\n<div class=\"line number46 index45 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python string\">'C:\/testing\/testing.gdb\/identical'<\/code><code class=\"python plain\">)<\/code><\/div>\n<div class=\"line number47 index46 alt2\"><\/div>\n<div class=\"line number48 index47 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># Synchronize the main process with the job processes to ensure<\/code><\/div>\n<div class=\"line number49 index48 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># proper cleanup.<\/code><\/div>\n<div class=\"line number50 index49 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">pool.close()<\/code><\/div>\n<div class=\"line number51 index50 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">pool.join()<\/code><\/div>\n<div class=\"line number52 index51 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># End main<\/code><\/div>\n<div class=\"line number53 index52 alt2\"><\/div>\n<div class=\"line number54 index53 alt1\"><code class=\"python keyword\">if<\/code> <code class=\"python plain\">__name__ <\/code><code class=\"python keyword\">=<\/code><code class=\"python keyword\">=<\/code> <code class=\"python string\">'__main__'<\/code><code class=\"python plain\">:<\/code><\/div>\n<div class=\"line number55 index54 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">main()<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The example above splits the data using spatial extents. However, there are tools that do not require data be split spatially. The Generate Near Table example below, shows the data processed in groups of 250000 features by selecting them based on object ID ranges.<\/p>\n<div>\n<div id=\"highlighter_478070\" class=\"syntaxhighlighter python\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<div class=\"line number24 index23 alt1\">24<\/div>\n<div class=\"line number25 index24 alt2\">25<\/div>\n<div class=\"line number26 index25 alt1\">26<\/div>\n<div class=\"line number27 index26 alt2\">27<\/div>\n<div class=\"line number28 index27 alt1\">28<\/div>\n<div class=\"line number29 index28 alt2\">29<\/div>\n<div class=\"line number30 index29 alt1\">30<\/div>\n<div class=\"line number31 index30 alt2\">31<\/div>\n<div class=\"line number32 index31 alt1\">32<\/div>\n<div class=\"line number33 index32 alt2\">33<\/div>\n<div class=\"line number34 index33 alt1\">34<\/div>\n<div class=\"line number35 index34 alt2\">35<\/div>\n<div class=\"line number36 index35 alt1\">36<\/div>\n<div class=\"line number37 index36 alt2\">37<\/div>\n<div class=\"line number38 index37 alt1\">38<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"python keyword\">import<\/code> <code class=\"python plain\">multiprocessing<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"python keyword\">import<\/code> <code class=\"python plain\">numpy<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"python keyword\">import<\/code> <code class=\"python plain\">arcpy<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"python keyword\">def<\/code> <code class=\"python plain\">generate_near_table(ranges):<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">i, j <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">ranges[<\/code><code class=\"python value\">0<\/code><code class=\"python plain\">], ranges[<\/code><code class=\"python value\">1<\/code><code class=\"python plain\">]<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">lyr <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">arcpy.management.MakeFeatureLayer(<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python string\">'c:\/testing\/testing.gdb\/random1mil'<\/code><code class=\"python plain\">,<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python string\">'layer{0}'<\/code><code class=\"python plain\">.<\/code><code class=\"python functions\">format<\/code><code class=\"python plain\">(i), <\/code><code class=\"python comments\">\"\"\"OID &amp;gt;= {0} AND<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\">OID &amp;lt;= {1}\"\"\"<\/code><code class=\"python plain\">.<\/code><code class=\"python functions\">format<\/code><code class=\"python plain\">((i, j)))<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">gn_table <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">arcpy.analysis.GenerateNearTable(<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">lyr, <\/code><code class=\"python string\">'c:\/testing\/testing.gdb\/random300'<\/code><code class=\"python plain\">,<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python string\">'in_memory\/outnear{0}'<\/code><code class=\"python plain\">.<\/code><code class=\"python functions\">format<\/code><code class=\"python plain\">(i))<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">result_array <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">arcpy.da.TableToNumPyArray(gn_table, [<\/code><code class=\"python string\">\"*\"<\/code><code class=\"python plain\">])<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">arcpy.management.Delete(gn_table)<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python keyword\">return<\/code> <code class=\"python plain\">result_array<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># End generate_near_table function<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"python keyword\">def<\/code> <code class=\"python plain\">main():<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">ranges <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">[[<\/code><code class=\"python value\">0<\/code><code class=\"python plain\">, <\/code><code class=\"python value\">250000<\/code><code class=\"python plain\">], [<\/code><code class=\"python value\">250001<\/code><code class=\"python plain\">, <\/code><code class=\"python value\">500000<\/code><code class=\"python plain\">], [<\/code><code class=\"python value\">500001<\/code><code class=\"python plain\">, <\/code><code class=\"python value\">750000<\/code><code class=\"python plain\">],<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">[<\/code><code class=\"python value\">750001<\/code><code class=\"python plain\">, <\/code><code class=\"python value\">1000001<\/code><code class=\"python plain\">]]<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># Create a pool class and run the jobs--the number of jobs is<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># equal to the length of the oids list<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">pool <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">multiprocessing.Pool()<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">result_arrays <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">pool.<\/code><code class=\"python functions\">map<\/code><code class=\"python plain\">(generate_near_table, ranges)<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># Concatenate the resulting arrays and create an output table<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># reporting any identical records.<\/code><\/div>\n<div class=\"line number28 index27 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">result_array <\/code><code class=\"python keyword\">=<\/code> <code class=\"python plain\">numpy.concatenate(result_arrays,axis<\/code><code class=\"python keyword\">=<\/code><code class=\"python value\">0<\/code><code class=\"python plain\">)<\/code><\/div>\n<div class=\"line number29 index28 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">arcpy.da.NumPyArrayToTable(result_array, <\/code><code class=\"python string\">'c:\/testing\/testing.gdb\/gn3'<\/code><code class=\"python plain\">)<\/code><\/div>\n<div class=\"line number30 index29 alt1\"><\/div>\n<div class=\"line number31 index30 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># Synchronize the main process with the job processes to<\/code><\/div>\n<div class=\"line number32 index31 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># Ensure proper cleanup.<\/code><\/div>\n<div class=\"line number33 index32 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">pool.close()<\/code><\/div>\n<div class=\"line number34 index33 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">pool.join()<\/code><\/div>\n<div class=\"line number35 index34 alt2\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python comments\"># End main<\/code><\/div>\n<div class=\"line number36 index35 alt1\"><\/div>\n<div class=\"line number37 index36 alt2\"><code class=\"python keyword\">if<\/code> <code class=\"python plain\">__name__ <\/code><code class=\"python keyword\">=<\/code><code class=\"python keyword\">=<\/code> <code class=\"python string\">'__main__'<\/code><code class=\"python plain\">:<\/code><\/div>\n<div class=\"line number38 index37 alt1\"><code class=\"python spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"python plain\">main()<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2><strong>Considerations<\/strong><\/h2>\n<p>Here are some important considerations before deciding to use multiprocessing:<\/p>\n<ol>\n<li>The scenario demonstrated in the first example, will not work with feature classes in a file geodatabase because each update must acquire a schema lock on the workspace. A schema lock effectively prevents any other process from simultaneously updating the FGDB. This example will however, work with shapefiles and ArcSDE geodatabase data.<\/li>\n<li>For each process, there is a start-up cost in loading the arcpy library (1-3 seconds). Depending on the complexity and size of the data, this can cause the multiprocessing script to take longer to run than a script without multiprocessing. In many cases, the final step in the multiprocessing workflow is to aggregate all results together which is an additional cost.<\/li>\n<li>Determining if multiprocessing is appropriate for your workflow can often be a trial and error process. This process can invalidate the gains made using multiprocessing in a one off operation; however, the trial and error process may be very valuable if the final workflow is to be run multiple times, or applied to similar workflows using large data. For example, if you are running the Find Identical tool on a weekly basis, and it is running for hours with your data, multiprocessing may be worth the effort.<\/li>\n<li>Whenever possible, take advantage of the \u201cin_memory\u201d workspace for creating temporary data. It can improve performance rather than writing data to disk. However, depending on the size of data being created in-memory, it may be necessary to write temporary data to disk. Temporary datasets cannot be created in a file geodatabase because of schema locking. Deleting the in-memory dataset when you are finished can prevent out of memory errors.<\/li>\n<\/ol>\n<h2><strong>Summary<\/strong><\/h2>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>These are just a few examples showing how multiprocessing can be used to increase performance and scalability when doing geoprocessing. However, it is important to remember that multiprocessing does not always mean better performance.<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>The multiprocessing module was included in Python 2.6 and the examples above will work in ArcGIS 10.1. For more information about the multiprocessing module, refer the Python documentation,<\/ol>\n<\/li>\n<\/ol>\n<p><a href=\"http:\/\/docs.python.org\/library\/multiprocessing.html\">http:\/\/docs.python.org\/library\/multiprocessing.html<\/a><\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>Please provide any feedback and comments to this blog posting, and stay tuned for another posting coming soon about \u201cBeing successful processing large complex data with the geoprocessing overlay tools\u201d.<\/ol>\n<\/li>\n<\/ol>\n<p><em><strong>This post was contributed by Jason Pardy, a product engineer on the analysis and geoprocessing team.<\/strong><\/em><\/p>\n"}],"authors":[{"ID":5121,"user_firstname":"","user_lastname":"","nickname":"jpardy84","user_nicename":"jpardy84","display_name":"jpardy","user_email":"jpardy@esri.com","user_url":"","user_registered":"2018-03-02 00:16:49","user_description":"","user_avatar":"<img alt='' src='https:\/\/secure.gravatar.com\/avatar\/ef5394b9654988f205fc1c43beebaef1eea90faf08e750f1b4d89434fc733f9b?s=96&#038;d=blank&#038;r=g' srcset='https:\/\/secure.gravatar.com\/avatar\/ef5394b9654988f205fc1c43beebaef1eea90faf08e750f1b4d89434fc733f9b?s=192&#038;d=blank&#038;r=g 2x' class='avatar avatar-96 photo' height='96' width='96' loading='lazy' decoding='async'\/>"}],"related_articles":"","card_image":false,"wide_image":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Multiprocessing with ArcGIS \u2013 Approaches and Considerations (Part 1)<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Multiprocessing with ArcGIS \u2013 Approaches and Considerations (Part 1)\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1\" \/>\n<meta property=\"og:site_name\" content=\"ArcGIS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/esrigis\/\" \/>\n<meta property=\"article:modified_time\" content=\"2018-12-18T19:22:35+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1\"},\"author\":{\"name\":\"jpardy\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/424b923d0991fee8d20fd49f9912af94\"},\"headline\":\"Multiprocessing with ArcGIS \u2013 Approaches and Considerations (Part 1)\",\"datePublished\":\"2012-09-26T17:59:32+00:00\",\"dateModified\":\"2018-12-18T19:22:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1\"},\"wordCount\":7,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"ArcPy\",\"geoprocessing\",\"python\"],\"articleSection\":[\"Analytics\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1\",\"name\":\"Multiprocessing with ArcGIS \u2013 Approaches and Considerations (Part 1)\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2012-09-26T17:59:32+00:00\",\"dateModified\":\"2018-12-18T19:22:35+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Multiprocessing with ArcGIS \u2013 Approaches and Considerations (Part 1)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"name\":\"ArcGIS Blog\",\"description\":\"Get insider info from Esri product teams\",\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\",\"name\":\"Esri\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"width\":400,\"height\":400,\"caption\":\"Esri\"},\"image\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/esrigis\/\",\"https:\/\/x.com\/ESRI\",\"https:\/\/www.linkedin.com\/company\/5311\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/424b923d0991fee8d20fd49f9912af94\",\"name\":\"jpardy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ef5394b9654988f205fc1c43beebaef1eea90faf08e750f1b4d89434fc733f9b?s=96&d=blank&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/ef5394b9654988f205fc1c43beebaef1eea90faf08e750f1b4d89434fc733f9b?s=96&d=blank&r=g\",\"caption\":\"jpardy\"},\"url\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Multiprocessing with ArcGIS \u2013 Approaches and Considerations (Part 1)","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1","og_locale":"en_US","og_type":"article","og_title":"Multiprocessing with ArcGIS \u2013 Approaches and Considerations (Part 1)","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2018-12-18T19:22:35+00:00","twitter_card":"summary_large_image","twitter_site":"@ESRI","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1"},"author":{"name":"jpardy","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/424b923d0991fee8d20fd49f9912af94"},"headline":"Multiprocessing with ArcGIS \u2013 Approaches and Considerations (Part 1)","datePublished":"2012-09-26T17:59:32+00:00","dateModified":"2018-12-18T19:22:35+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1"},"wordCount":7,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["ArcPy","geoprocessing","python"],"articleSection":["Analytics"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1","name":"Multiprocessing with ArcGIS \u2013 Approaches and Considerations (Part 1)","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2012-09-26T17:59:32+00:00","dateModified":"2018-12-18T19:22:35+00:00","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/multiprocessing-with-arcgis-approaches-and-considerations-part-1#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"Multiprocessing with ArcGIS \u2013 Approaches and Considerations (Part 1)"}]},{"@type":"WebSite","@id":"https:\/\/www.esri.com\/arcgis-blog\/#website","url":"https:\/\/www.esri.com\/arcgis-blog\/","name":"ArcGIS Blog","description":"Get insider info from Esri product teams","publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization","name":"Esri","url":"https:\/\/www.esri.com\/arcgis-blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","width":400,"height":400,"caption":"Esri"},"image":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/esrigis\/","https:\/\/x.com\/ESRI","https:\/\/www.linkedin.com\/company\/5311\/"]},{"@type":"Person","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/424b923d0991fee8d20fd49f9912af94","name":"jpardy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/ef5394b9654988f205fc1c43beebaef1eea90faf08e750f1b4d89434fc733f9b?s=96&d=blank&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ef5394b9654988f205fc1c43beebaef1eea90faf08e750f1b4d89434fc733f9b?s=96&d=blank&r=g","caption":"jpardy"},"url":""}]}},"text_date":"September 26, 2012","author_name":"jpardy","author_page":false,"custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/Newsroom-Keyart-Wide-1920-x-1080.jpg","primary_product":"ArcMap","tag_data":[{"term_id":31181,"name":"ArcPy","slug":"arcpy","term_group":0,"term_taxonomy_id":31181,"taxonomy":"post_tag","description":"","parent":0,"count":32,"filter":"raw"},{"term_id":24321,"name":"geoprocessing","slug":"geoprocessing","term_group":0,"term_taxonomy_id":24321,"taxonomy":"post_tag","description":"","parent":0,"count":129,"filter":"raw"},{"term_id":24341,"name":"python","slug":"python","term_group":0,"term_taxonomy_id":24341,"taxonomy":"post_tag","description":"","parent":0,"count":171,"filter":"raw"}],"category_data":[{"term_id":23341,"name":"Analytics","slug":"analytics","term_group":0,"term_taxonomy_id":23341,"taxonomy":"category","description":"","parent":0,"count":1326,"filter":"raw"}],"product_data":[{"term_id":36991,"name":"ArcMap","slug":"arcgis-desktop","term_group":0,"term_taxonomy_id":36991,"taxonomy":"product","description":"","parent":36981,"count":325,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=arcgis-desktop","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/182521","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/users\/5121"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=182521"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/182521\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=182521"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=182521"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=182521"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=182521"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=182521"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}