Мне нужно обновить каждую запись в пространственной базе данных, в которой у меня есть набор данных точек, которые перекрывают набор данных полигонов. Для каждого точечного объекта я хочу назначить ключ, чтобы связать его с полигональным объектом, в котором он находится. Поэтому, если моя точка «Нью-Йорк» находится в пределах полигона США, а для полигона США «GID = 1» я назначу «gid_fkey = 1» для моей точки Нью-Йорк.
Для этого я создал следующий запрос.
procQuery = 'UPDATE city SET gid_fkey = gid FROM country WHERE ST_within((SELECT the_geom FROM city WHERE wp_id = %s), country.the_geom) AND city_id = %s' % (cityID, cityID)
В настоящее время я получаю информацию о cityID из другого запроса, который просто выбирает все cityID, где gid_fkey равен NULL. По сути, мне просто нужно пройтись по ним и запустить запрос, показанный ранее. Поскольку запрос опирается только на статическую информацию из другой таблицы, теоретически все эти процессы могут выполняться одновременно. Я реализовал процедуру потоков ниже, но я не могу перейти на многопроцессорность
import psycopg2, pprint, threading, time, Queue
queue = Queue.Queue()
pyConn = psycopg2.connect("dbname='geobase_1' host='localhost'")
pyConn.set_isolation_level(0)
pyCursor1 = pyConn.cursor()
getGID = 'SELECT cityID FROM city'
pyCursor1.execute(getGID)
gidList = pyCursor1.fetchall()
class threadClass(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while True:
gid = self.queue.get()
procQuery = 'UPDATE city SET gid_fkey = gid FROM country WHERE ST_within((SELECT the_geom FROM city WHERE wp_id = %s), country.the_geom) AND city_id = %s' % (cityID, cityID)
pyCursor2 = pyConn.cursor()
pyCursor2.execute(procQuery)
print gid[0]
print 'Done'
def main():
for i in range(4):
t = threadClass(queue)
t.setDaemon(True)
t.start()
for gid in gidList:
queue.put(gid)
queue.join()
main()
Я даже не уверен, что многопоточность оптимальна, но она определенно быстрее, чем проходить один за другим.
Машина, которую я буду использовать, имеет четыре ядра (Quad Core) и минимальную ОС Linux без GUI, PostgreSQL, PostGIS и Python, если это имеет значение.
Что мне нужно изменить, чтобы включить эту болезненно простую многопроцессорную задачу?