CBS'de yaygın bir gereklilik, bir dizi dosyaya bir işleme aracı uygulamak veya bir dosyadaki birkaç özellik için bir işlemi başka bir dosyaya uygulamaktır.
Bu işlemlerin çoğu, hesaplamaların sonuçlarının döngüdeki diğer işlemleri hiçbir şekilde etkilememesi nedeniyle utanç verici bir şekilde paraleldir. Sadece bu değil, çoğu zaman girdi dosyalarının her biri farklıdır.
Klasik bir durum, şekil dosyalarının, kırpmak için çokgen içeren dosyalara döşenmesidir.
İşte QGIS için bir python betiğinde bunu başarmak için (test edilmiş) klasik bir yöntem. (geçici bellek dosyalarının çıktısının gerçek dosyalara çıktısı, test dosyalarımı işlemek için zamanı yarıya indirdi)
import processing
import os
input_file="/path/to/input_file.shp"
clip_polygons_file="/path/to/polygon_file.shp"
output_folder="/tmp/test/"
input_layer = QgsVectorLayer(input_file, "input file", "ogr")
QgsMapLayerRegistry.instance().addMapLayer(input_layer)
tile_layer = QgsVectorLayer(clip_polygons_file, "clip_polys", "ogr")
QgsMapLayerRegistry.instance().addMapLayer(tile_layer)
tile_layer_dp=input_layer.dataProvider()
EPSG_code=int(tile_layer_dp.crs().authid().split(":")[1])
tile_no=0
clipping_polygons = tile_layer.getFeatures()
for clipping_polygon in clipping_polygons:
print "Tile no: "+str(tile_no)
tile_no+=1
geom = clipping_polygon.geometry()
clip_layer=QgsVectorLayer("Polygon?crs=epsg:"+str(EPSG_code)+\
"&field=id:integer&index=yes","clip_polygon", "memory")
clip_layer_dp = clip_layer.dataProvider()
clip_layer.startEditing()
clip_layer_feature = QgsFeature()
clip_layer_feature.setGeometry(geom)
(res, outFeats) = clip_layer_dp.addFeatures([clip_layer_feature])
clip_layer.commitChanges()
clip_file = os.path.join(output_folder,"tile_"+str(tile_no)+".shp")
write_error = QgsVectorFileWriter.writeAsVectorFormat(clip_layer, \
clip_file, "system", \
QgsCoordinateReferenceSystem(EPSG_code), "ESRI Shapefile")
QgsMapLayerRegistry.instance().addMapLayer(clip_layer)
output_file = os.path.join(output_folder,str(tile_no)+".shp")
processing.runalg("qgis:clip", input_file, clip_file, output_file)
QgsMapLayerRegistry.instance().removeMapLayer(clip_layer.id())
Giriş dosyamın 2GB olması ve çokgen kırpma dosyasının 400'den fazla çokgen içermesi dışında bu iyi olur. Ortaya çıkan süreç dört çekirdekli makinemde bir haftadan fazla sürüyor. Bu arada üç çekirdek sadece rölantide.
Kafamdaki çözüm, süreci komut dosyalarına dışa aktarmak ve örneğin gnu paralelini kullanarak eşzamansız olarak çalıştırmaktır. Bununla birlikte, QGIS python'a özgü bir şey kullanmak yerine QGIS'i işletim sistemine özgü bir çözüme bırakmak zorunda olmak utanç verici görünüyor. Benim sorum şu:
Python QGIS içindeki yerel olarak utanç verici şekilde paralel coğrafi işlemleri paralel hale getirebilir miyim?
Değilse, belki de birileri bu tür işleri asenkron kabuk komut dosyalarına göndermek için zaten bir koda sahiptir?