Hello everybody,
I have an arcpy program, that performs a series of different clips on an incoming geometry. I am only interested in the result, if there are geometries in the clip's result.
To use this tool in an web application, I have published it as a geoprocessing service,
For the sake of performance I want to calculate the several clips simultaneously.
I found this tutorial:
Parallel Python: Multiprocessing with ArcPy - YouTube
So I came to this solution (compressed to the basic I hope not have cut something important):
<SPAN class="keyword token">import</SPAN> time
<SPAN class="keyword token">import</SPAN> sys<SPAN class="punctuation token">,</SPAN> os
<SPAN class="keyword token">from</SPAN> multiprocessing <SPAN class="keyword token">import</SPAN> Pool
<SPAN class="keyword token">import</SPAN> logging
<SPAN class="keyword token">import</SPAN> arcpy
logging<SPAN class="punctuation token">.</SPAN>basicConfig<SPAN class="punctuation token">(</SPAN>filename<SPAN class="operator token">=</SPAN>os<SPAN class="punctuation token">.</SPAN>path<SPAN class="punctuation token">.</SPAN>join<SPAN class="punctuation token">(</SPAN>arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>scratchWorkspace<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"../"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"20181204_BQ1_I.log"</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> level<SPAN class="operator token">=</SPAN>logging<SPAN class="punctuation token">.</SPAN>INFO<SPAN class="punctuation token">,</SPAN> format<SPAN class="operator token">=</SPAN><SPAN class="string token">'%(created)f %(asctime)s %(message)s'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token"># Some constants are set to link in the databases</SPAN>
out_path <SPAN class="operator token">=</SPAN> <SPAN class="string token">"in_memory"</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace <SPAN class="operator token">=</SPAN> out_path
arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>scratchWorkspace <SPAN class="operator token">=</SPAN> out_path
out_name_geometry <SPAN class="operator token">=</SPAN> <SPAN class="string token">"JustAName"</SPAN>
spatial_reference <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>SpatialReference<SPAN class="punctuation token">(</SPAN><SPAN class="number token">2056</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">clipfun</SPAN><SPAN class="punctuation token">(</SPAN>result<SPAN class="punctuation token">,</SPAN> kind<SPAN class="punctuation token">,</SPAN> out_geometry<SPAN class="punctuation token">,</SPAN>timeString<SPAN class="punctuation token">,</SPAN>sde<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="comment token"># the data will be set according to the kind </SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>analysis<SPAN class="punctuation token">.</SPAN>Clip<SPAN class="punctuation token">(</SPAN>kind <SPAN class="punctuation token">,</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>scratchGDB <SPAN class="operator token">+</SPAN> <SPAN class="string token">"\\"</SPAN> <SPAN class="operator token">+</SPAN> out_name_geometry <SPAN class="operator token">+</SPAN> timeString<SPAN class="punctuation token">,</SPAN>
out_geometry <SPAN class="operator token">+</SPAN> <SPAN class="string token">"_Clip_"</SPAN> <SPAN class="operator token">+</SPAN> kind<SPAN class="punctuation token">)</SPAN>
rows <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>SearchCursor<SPAN class="punctuation token">(</SPAN>out_geometry <SPAN class="operator token">+</SPAN> <SPAN class="string token">"_Clip_"</SPAN> <SPAN class="operator token">+</SPAN> kind<SPAN class="punctuation token">,</SPAN>
<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"SHAPE@AREA"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
result<SPAN class="punctuation token">[</SPAN>kind<SPAN class="operator token">+</SPAN><SPAN class="string token">"_res"</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="punctuation token">}</SPAN>
ergebnis<SPAN class="punctuation token">[</SPAN>kind<SPAN class="operator token">+</SPAN><SPAN class="string token">"_res"</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> <SPAN class="token boolean">False</SPAN>
<SPAN class="keyword token">for</SPAN> row <SPAN class="keyword token">in</SPAN> rows<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">if</SPAN> row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">>=</SPAN> schwellwertMeter<SPAN class="punctuation token">:</SPAN>
result<SPAN class="punctuation token">[</SPAN>kind<SPAN class="operator token">+</SPAN><SPAN class="string token">"_res"</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> <SPAN class="token boolean">True</SPAN>
<SPAN class="keyword token">break</SPAN>
<SPAN class="keyword token">del</SPAN> rows
<SPAN class="keyword token">if</SPAN> row <SPAN class="keyword token">is</SPAN> <SPAN class="operator token">not</SPAN> None<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">del</SPAN> row
<SPAN class="keyword token">return</SPAN> result<SPAN class="punctuation token">[</SPAN>kind<SPAN class="operator token">+</SPAN> <SPAN class="string token">"_res"</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">if</SPAN> __name__ <SPAN class="operator token">==</SPAN> <SPAN class="string token">'__main__'</SPAN><SPAN class="punctuation token">:</SPAN>
geometry_as_json <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>GetParameter<SPAN class="punctuation token">(</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token"># Set local variables</SPAN>
timeString <SPAN class="operator token">=</SPAN> str<SPAN class="punctuation token">(</SPAN>time<SPAN class="punctuation token">.</SPAN>time<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN>replace<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"."</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"_"</SPAN><SPAN class="punctuation token">)</SPAN>
out_geometry <SPAN class="operator token">=</SPAN> out_path <SPAN class="operator token">+</SPAN> <SPAN class="string token">"\\"</SPAN> <SPAN class="operator token">+</SPAN> out_name_geometry <SPAN class="operator token">+</SPAN> timeString
<SPAN class="comment token"># Execute CreateFeatureclass</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>CreateFeatureclass_management<SPAN class="punctuation token">(</SPAN>arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>scratchGDB<SPAN class="punctuation token">,</SPAN>
out_name_geometry <SPAN class="operator token">+</SPAN> timeString<SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">"POLYGON"</SPAN><SPAN class="punctuation token">,</SPAN>
"<SPAN class="comment token">#",</SPAN>
<SPAN class="string token">"DISABLED"</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">"DISABLED"</SPAN><SPAN class="punctuation token">,</SPAN>
spatial_reference<SPAN class="punctuation token">)</SPAN>
c <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>InsertCursor<SPAN class="punctuation token">(</SPAN>arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>scratchGDB <SPAN class="operator token">+</SPAN> <SPAN class="string token">"\\"</SPAN> <SPAN class="operator token">+</SPAN> out_name_geometry <SPAN class="operator token">+</SPAN> timeString<SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">"SHAPE@JSON"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
c<SPAN class="punctuation token">.</SPAN>insertRow<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">[</SPAN>geometry_as_json<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">del</SPAN> c
res<SPAN class="operator token">=</SPAN><SPAN class="punctuation token">{</SPAN>
<SPAN class="string token">"LV_res"</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="string token">""</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">"NkB_res"</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="string token">""</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">"NkBW_res"</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">""</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="string token">"DG_res"</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="string token">""</SPAN>
ps <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN>
funcs<SPAN class="operator token">=</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">(</SPAN>res<SPAN class="punctuation token">,</SPAN><SPAN class="string token">"LV"</SPAN><SPAN class="punctuation token">,</SPAN>out_geometry<SPAN class="punctuation token">,</SPAN>timeString<SPAN class="punctuation token">,</SPAN>sde<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="punctuation token">(</SPAN>res<SPAN class="punctuation token">,</SPAN><SPAN class="string token">"NkB"</SPAN><SPAN class="punctuation token">,</SPAN>out_geometry<SPAN class="punctuation token">,</SPAN>timeString<SPAN class="punctuation token">,</SPAN>sde<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="punctuation token">(</SPAN>res<SPAN class="punctuation token">,</SPAN><SPAN class="string token">"NkBW"</SPAN><SPAN class="punctuation token">,</SPAN>out_geometry<SPAN class="punctuation token">,</SPAN>timeString<SPAN class="punctuation token">,</SPAN>sde<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="punctuation token">(</SPAN>res<SPAN class="punctuation token">,</SPAN><SPAN class="string token">"DG"</SPAN><SPAN class="punctuation token">,</SPAN>out_geometry<SPAN class="punctuation token">,</SPAN>timeString<SPAN class="punctuation token">,</SPAN>sde<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN>
p <SPAN class="operator token">=</SPAN> Pool <SPAN class="punctuation token">(</SPAN>processes<SPAN class="operator token">=</SPAN><SPAN class="number token">4</SPAN><SPAN class="punctuation token">)</SPAN>
erg <SPAN class="operator token">=</SPAN> p<SPAN class="punctuation token">.</SPAN>map<SPAN class="punctuation token">(</SPAN>callfunction<SPAN class="punctuation token">,</SPAN>funcs<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>SetParameter<SPAN class="punctuation token">(</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN> res<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"LV_res"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>SetParameter<SPAN class="punctuation token">(</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">,</SPAN> res<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"NkB_res"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>SetParameter<SPAN class="punctuation token">(</SPAN><SPAN class="number token">3</SPAN><SPAN class="punctuation token">,</SPAN> res<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"NkBW_res"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>SetParameter<SPAN class="punctuation token">(</SPAN><SPAN class="number token">4</SPAN><SPAN class="punctuation token">,</SPAN> res<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"DG_res"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
logging<SPAN class="punctuation token">.</SPAN>info<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Ende'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>I can run this Tool in an arcGIS for desktop Toolbox and I can publish it to an arcGIS for server as an geoprocessing service.
But when I try to run this new service I got this error:
Fehler bei der Ausführung des Werkzeuges. ITest Job ID: j0cc0f30e501247dba8e7877929cc45ec : Traceback (most recent call last): File "D:\arcgisserver\directories\arcgissystem\arcgisinput\I2.GPServer\extracted\v101\lokal\Inventare_bestaende_ITest.py", line 255, in erg = p.map(clipfun,funcs) File "C:\Python27\ArcGISx6410.5\Lib\multiprocessing\pool.py", line 251, in map return self.map_async(func, iterable, chunksize).get() File "C:\Python27\ArcGISx6410.5\Lib\multiprocessing\pool.py", line 567, in get raise self._value PicklingError: Can't pickle <type 'function'="">: attribute lookup __builtin__.function failed Fehler beim Ausführen von (I2). Fehler beim Ausführen von (ITest).
Has anybody done something like that and can help me with this?
Tank you,
Andreas Ruloffs