Persyaratan umum dalam GIS adalah untuk menerapkan alat pemrosesan ke sejumlah file atau menerapkan proses untuk sejumlah fitur dalam satu file ke file lain.
Banyak dari operasi ini secara paralel memalukan karena hasil perhitungan sama sekali tidak memengaruhi operasi lainnya dalam loop. Tidak hanya itu tetapi seringkali file input masing-masing berbeda.
Kasus klasik yang dimaksud adalah pemasangan file bentuk terhadap file yang berisi poligon untuk klip mereka.
Berikut adalah metode prosedural klasik (teruji) untuk mencapai ini dalam skrip python untuk QGIS. (dari output file memori sementara ke file nyata lebih dari setengahnya waktu untuk memproses file pengujian saya)
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())
Ini akan baik-baik saja kecuali bahwa file input saya adalah 2GB dan file kliping poligon berisi 400+ poligon. Proses yang dihasilkan memakan waktu lebih dari seminggu di mesin quad core saya. Sementara tiga core hanya menganggur.
Solusi yang saya miliki di kepala saya adalah untuk mengekspor proses ke file skrip dan menjalankannya secara asinkron menggunakan gnu parallel misalnya. Namun sepertinya memalukan harus keluar dari QGIS ke dalam solusi spesifik OS daripada menggunakan sesuatu yang asli dari python QGIS. Jadi pertanyaan saya adalah:
Dapatkah saya memparalelkan operasi geografis paralel memalukan secara native di dalam python QGIS?
Jika tidak, maka mungkin seseorang sudah memiliki kode untuk mengirim pekerjaan semacam ini ke skrip shell asinkron?