{"id":176601,"date":"2011-08-29T23:08:50","date_gmt":"2011-08-29T23:08:50","guid":{"rendered":"http:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=176601"},"modified":"2018-12-18T11:30:52","modified_gmt":"2018-12-18T19:30:52","slug":"python-multiprocessing-approaches-and-considerations","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/python-multiprocessing-approaches-and-considerations","title":{"rendered":"Python Multiprocessing \u2013 Approaches and Considerations"},"author":4041,"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,23851],"tags":[31181,24321,24341],"industry":[],"product":[36991],"class_list":["post-176601","blog","type-blog","status-publish","format-standard","hentry","category-analytics","category-data-management","tag-arcpy","tag-geoprocessing","tag-python","product-arcgis-desktop"],"acf":{"short_description":"The\u00a0multiprocessing\u00a0Python module provides functionality for distributing work between multiple processes","flexible_content":[{"acf_fc_layout":"content","content":"<p>The\u00a0<i>multiprocessing<\/i>\u00a0Python module provides functionality for distributing work between multiple processes, 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.<\/p>\n<p>There are two approaches to using multiprocessing for improving performance or scalability:<\/p>\n<ul>\n<li>Processing many individual datasets<\/li>\n<li>Processing datasets with many features<\/li>\n<\/ul>\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 multiprocessing.<\/p>\n<h2>1. Processing large numbers of datasets<\/h2>\n<p>The first example performs 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 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<p>import os<br \/>\nimport re<br \/>\nimport multiprocessing<br \/>\nimport arcpy<\/p>\n<p>def update_shapefiles(shapefile):<\/p>\n<p># Define the projection to wgs84 \u2014 factory code is 4326.<\/p>\n<p>arcpy.management.DefineProjection(shapefile, 4326)<\/p>\n<p># Add a field named CITY of type TEXT.<\/p>\n<p>arcpy.management.AddField(shapefile, \u2018CITY\u2019, \u2018TEXT\u2019)<\/p>\n<p># Calculate field \u2018CITY\u2019 stripping \u2018_base\u2019 from the shapefile name.<\/p>\n<p>city_name = shapefile.split(\u2018_base\u2019)[0]<br \/>\ncity_name = re.sub(\u2018_\u2019, \u2018 \u2018, city_name)<br \/>\narcpy.management.CalculateField(shapefile, \u2018CITY\u2019, \u2018\u201d{0}\u201d\u2018.format(city_name.upper()), \u2018PYTHON\u2019)<\/p>\n<p># End update_shapefiles<\/p>\n<p>def main():<\/p>\n<p># Create a pool class and run the jobs\u2013the number of jobs is equal to the number of shapefiles<\/p>\n<p>workspace = r\u2019C:GISDataUSAusa\u2019<br \/>\narcpy.env.workspace = workspace<\/p>\n<p>fcs = arcpy.ListFeatureClasses(\u2018*\u2019)<\/p>\n<p>fc_list = [os.path.join(workspace, fc) for fc in fcs]<\/p>\n<p>pool = multiprocessing.Pool()<\/p>\n<p>pool.map(update_shapefiles, fc_list)<\/p>\n<p># Synchronize the main process with the job processes to ensure proper cleanup.<\/p>\n<p>pool.close()<\/p>\n<p>pool.join()<\/p>\n<p># End main<\/p>\n<p>if __name__ == \u2018__main__\u2019:<br \/>\nmain()<\/p>\n<\/div>\n<h2>2. Processing a individual dataset with a lot of features and records<\/h2>\n<p>This second example looks at geoprocessing tools analyzing 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. For example, finding identical features may be faster when you split a large feature class into groups, based on spatial extents. The following code uses a pre-defined fishnet of polygons covering the extent of 1 million points (Figure 1).<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/edn1.esri.com\/blogimages\/gp\/082911_2339_Multiproces1.png\" alt=\"\" \/><\/p>\n<p><i>Figure 1: A fishnet of polygons covering the extent of one million points.<\/i><\/p>\n<div>\n<p>import multiprocessing<br \/>\nimport arcpy<\/p>\n<p>def find_identical(oid):<\/p>\n<p># Create a feature layer for the tile in the fishnet.<\/p>\n<p>tile = arcpy.management.MakeFeatureLayer(r\u2019c:testingtesting.gdbfishnet\u2019, \u2018layer{0}\u2019.format(oid[0]),<\/p>\n<p>\u201c\u201dOID = {0}\u201d&#8221;\u201d.format((oid[0])))<\/p>\n<p># Get the extent of the feature layer and set the extent environment.<\/p>\n<p>tile_row = arcpy.SearchCursor(tile)<\/p>\n<p>geometry = tile_row.next().shape<\/p>\n<p>arcpy.env.extent = geometry.extent<\/p>\n<p># Execute Find Identical<\/p>\n<p>identical_table = arcpy.management.FindIdentical(r\u2019c:testingtesting.gdbrandom1mil\u2019, r\u2019c:cursortestingidentical{0}.dbf\u2019.format(oid[0]),\u00a0 \u2018Shape\u2019)<br \/>\nreturn identical_table.getOutput(0)<\/p>\n<p># End find_identical<\/p>\n<p>def main():<\/p>\n<p># Create a list of OID\u2019s used to chunk the inputs<\/p>\n<p>fishnet_rows = arcpy.SearchCursor(r\u2019c:testingtesting.gdbfishnet\u2019, \u201d, \u201d, \u2018OID\u2019)<\/p>\n<p>oids = [[row.getValue(&#8216;OID&#8217;)] for row in fishnet_rows]<\/p>\n<p># Create a pool class and run the jobs\u2013the number of jobs is equal to the length of the oids list<\/p>\n<p>pool = multiprocessing.Pool()<\/p>\n<p>result_tables = pool.map(find_identical, oids)<\/p>\n<p># Merge the all the temporary output tables \u2014 this is optional. Omitting this can increase performance.<\/p>\n<p>arcpy.management.Merge(result_tables, r\u2019C:cursortestingctesting.gdbfind_identical\u2019)<\/p>\n<p># Synchronize the main process with the job processes to ensure proper cleanup.<\/p>\n<p>pool.close()<br \/>\npool.join()<\/p>\n<p># End main<\/p>\n<p>if __name__ == \u2018__main__\u2019:<\/p>\n<p>main()<\/p>\n<\/div>\n<p>There are tools that do not require data be split spatially. The Generate Near Table example below, shows the data processed in groups of\u00a0250000 features\u00a0by selecting them based on object ID ranges.<\/p>\n<div>\n<p>import multiprocessing<br \/>\nimport arcpy<\/p>\n<p>def generate_near_table(oid_range):<\/p>\n<p>i = oid_range[0]<\/p>\n<p>j = oid_range[1]<\/p>\n<p>lyr = arcpy.management.MakeFeatureLayer(r\u2019c:testingtesting.gdbrandom1mil\u2019, \u2018layer{0}\u2019.format(i),<\/p>\n<p>\u201c\u201d&#8221;OID &gt;= {0} AND OID &lt;= {1}\u201d&#8221;\u201d.format(i, j))<\/p>\n<p>gn_table = arcpy.analysis.GenerateNearTable(lyr, r\u2019c:testingtesting.gdbrandom10000\u2032,<\/p>\n<p>r\u2019c:testingoutnear{0}.dbf\u2019.format(i))<br \/>\nreturn gn_table.getOutput(0)<\/p>\n<p># End generate_near_table function<\/p>\n<p>def main():<\/p>\n<p>oid_ranges = [[0, 250000], [250001, 500000], [500001, 750000], [750001, 1000001]]<\/p>\n<p>arcpy.env.overwriteOutput = True<\/p>\n<p># Create a pool class and run the jobs<\/p>\n<p>pool = multiprocessing.Pool()<\/p>\n<p>result_tables = pool.map(generate_near_table, oid_ranges)<\/p>\n<p># Merge resulting tables is optional. Can add overhead if not required.<\/p>\n<p>arcpy.management.Merge(result_tables, r\u2019c:cursortestingctesting.gdbgenerate_near_table\u2019)<\/p>\n<p># Synchronize the main process with the job processes to ensure proper cleanup.<\/p>\n<p>pool.close()<br \/>\npool.join()<\/p>\n<p># End main<\/p>\n<p>if __name__ == \u2018__main__\u2019:<\/p>\n<p>main()<\/p>\n<\/div>\n<h2>Considerations<\/h2>\n<p>Here are some important considerations before deciding to use multiprocessing:<\/p>\n<p>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 work with shapefiles and ArcSDE geodatabase data.<\/p>\n<p>For each process, there is a start-up cost 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.<\/p>\n<p>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.<\/p>\n<p>Whenever possible, take advantage of the \u201cin_memory\u201d workspace for creating temporary data to improve performance. 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.<\/p>\n<h2>Summary<\/h2>\n<p>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.<\/p>\n<p>The multiprocessing module was included in Python 2.6 and the examples above will work in ArcGIS 10.0. For more information about the multiprocessing module, refer the\u00a0<a href=\"http:\/\/docs.python.org\/library\/multiprocessing.html\">Python documentation<\/a>.<\/p>\n<p>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.<\/p>\n<p>&nbsp;<\/p>\n<p><b><i>This post contributed by Jason Pardy, a product engineer on the Analysis and Geoprocessing team<\/i><\/b><\/p>\n"}],"authors":[{"ID":4041,"user_firstname":"Shitij","user_lastname":"Mehta","nickname":"Shitij Mehta","user_nicename":"shitijmehta","display_name":"Shitij Mehta","user_email":"smehta@esri.com","user_url":"","user_registered":"2018-03-02 00:15:39","user_description":"Shitij is the product owner for ModelBuilder in ArcGIS Desktop and leads ModelBuilder efforts in web environments at Esri. She oversees the full product lifecycle\u2014from feature design and development to testing and refinement\u2014ensuring a seamless experience for users. Beyond the office, Shitij is a Heartfulness meditation trainer, dedicated volunteer, and passionate researcher focused on tigers and elephants.","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/10\/SM.png' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"}],"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>Python Multiprocessing \u2013 Approaches and Considerations<\/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\/python-multiprocessing-approaches-and-considerations\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python Multiprocessing \u2013 Approaches and Considerations\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/python-multiprocessing-approaches-and-considerations\" \/>\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:30:52+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\/python-multiprocessing-approaches-and-considerations#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/python-multiprocessing-approaches-and-considerations\"},\"author\":{\"name\":\"Shitij Mehta\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/e535f780f7b06cceac95bb5b8a079f16\"},\"headline\":\"Python Multiprocessing \u2013 Approaches and Considerations\",\"datePublished\":\"2011-08-29T23:08:50+00:00\",\"dateModified\":\"2018-12-18T19:30:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/python-multiprocessing-approaches-and-considerations\"},\"wordCount\":5,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"ArcPy\",\"geoprocessing\",\"python\"],\"articleSection\":[\"Analytics\",\"Data Management\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/python-multiprocessing-approaches-and-considerations\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/python-multiprocessing-approaches-and-considerations\",\"name\":\"Python Multiprocessing \u2013 Approaches and Considerations\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2011-08-29T23:08:50+00:00\",\"dateModified\":\"2018-12-18T19:30:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/python-multiprocessing-approaches-and-considerations#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/python-multiprocessing-approaches-and-considerations\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/python-multiprocessing-approaches-and-considerations#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python Multiprocessing \u2013 Approaches and Considerations\"}]},{\"@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\/e535f780f7b06cceac95bb5b8a079f16\",\"name\":\"Shitij Mehta\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/10\/SM.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/10\/SM.png\",\"caption\":\"Shitij Mehta\"},\"description\":\"Shitij is the product owner for ModelBuilder in ArcGIS Desktop and leads ModelBuilder efforts in web environments at Esri. She oversees the full product lifecycle\u2014from feature design and development to testing and refinement\u2014ensuring a seamless experience for users. Beyond the office, Shitij is a Heartfulness meditation trainer, dedicated volunteer, and passionate researcher focused on tigers and elephants.\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/author\/shitijmehta\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Python Multiprocessing \u2013 Approaches and Considerations","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\/python-multiprocessing-approaches-and-considerations","og_locale":"en_US","og_type":"article","og_title":"Python Multiprocessing \u2013 Approaches and Considerations","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/python-multiprocessing-approaches-and-considerations","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2018-12-18T19:30:52+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\/python-multiprocessing-approaches-and-considerations#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/python-multiprocessing-approaches-and-considerations"},"author":{"name":"Shitij Mehta","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/e535f780f7b06cceac95bb5b8a079f16"},"headline":"Python Multiprocessing \u2013 Approaches and Considerations","datePublished":"2011-08-29T23:08:50+00:00","dateModified":"2018-12-18T19:30:52+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/python-multiprocessing-approaches-and-considerations"},"wordCount":5,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["ArcPy","geoprocessing","python"],"articleSection":["Analytics","Data Management"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/python-multiprocessing-approaches-and-considerations","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/python-multiprocessing-approaches-and-considerations","name":"Python Multiprocessing \u2013 Approaches and Considerations","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2011-08-29T23:08:50+00:00","dateModified":"2018-12-18T19:30:52+00:00","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/python-multiprocessing-approaches-and-considerations#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/python-multiprocessing-approaches-and-considerations"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/analytics\/python-multiprocessing-approaches-and-considerations#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"Python Multiprocessing \u2013 Approaches and Considerations"}]},{"@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\/e535f780f7b06cceac95bb5b8a079f16","name":"Shitij Mehta","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/10\/SM.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/10\/SM.png","caption":"Shitij Mehta"},"description":"Shitij is the product owner for ModelBuilder in ArcGIS Desktop and leads ModelBuilder efforts in web environments at Esri. She oversees the full product lifecycle\u2014from feature design and development to testing and refinement\u2014ensuring a seamless experience for users. Beyond the office, Shitij is a Heartfulness meditation trainer, dedicated volunteer, and passionate researcher focused on tigers and elephants.","url":"https:\/\/www.esri.com\/arcgis-blog\/author\/shitijmehta"}]}},"text_date":"August 29, 2011","author_name":"Shitij Mehta","author_page":"https:\/\/www.esri.com\/arcgis-blog\/author\/shitijmehta","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":1328,"filter":"raw"},{"term_id":23851,"name":"Data Management","slug":"data-management","term_group":0,"term_taxonomy_id":23851,"taxonomy":"category","description":"","parent":0,"count":920,"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\/176601","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\/4041"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=176601"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/176601\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=176601"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=176601"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=176601"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=176601"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=176601"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}