phyghtmap unter Windows

Ich hab phyghtmap nach dieser Anleitung ( http://katze.tfiu.de/projects/phyghtmap/#WindowsInstallation ) in der 32bit Version unter Win 7 64bit installiert und zum laufen gebracht. Ich hab auch schon etwas mit dem -j Parameter gespielt, der wohl die Anzahl der Threads angibt. Allerdings bekomme ich phyghtmap nicht dazu mehr als einen Kern zu nutzen. Zur Verfügung würden 6 stehen.

Hat einer von euch eine Ahnung ob das unter Win überhaupt mit mehreren Threads läuft und wenn es das tut, was ich machen muss, damit es das tut?

Mit dem Teil hab ich noch nichts gemacht; aber bei Mapnik steht in der generate_tiles.py:


import threading

...

# Default number of rendering threads to spawn, should be roughly equal to number of CPU cores available
NUM_THREADS = 4


Bei phyghtmap sehe ich jetzt nicht, dass ein Modul threading importiert wird. Von alleine wird python nicht auf die Idee kommen, andere Threads zu starten.

Unter Windos XP lief das bei mir allerdings immer nur mit NUM_THREADS=1. Unter Windows 7 läuft 32-bit-Mapnik aber auch mit mehreren.

Weil das Problem den Entwicklern bekannt war, hat jemand generate_tiles_multiprocessing.py geschrieben. Das fängt so an:


import multiprocessing

...
# Default number of rendering threads to spawn, should be roughly equal to number of CPU cores available
NUM_THREADS = 4
...

    # Launch rendering threads
    queue = multiprocessing.JoinableQueue(32)
    printLock = multiprocessing.Lock()
    renderers = {}
    for i in range(num_threads):
        renderer = RenderThread(tile_dir, mapfile, queue, printLock, maxZoom)
        render_thread = multiprocessing.Process(target=renderer.loop)
        render_thread.start()
        #print "Started render thread %s" % render_thread.getName()
        renderers[i] = render_thread
...
    # Signal render threads to exit by sending empty request to queue
    for i in range(num_threads):
        queue.put(None)
    # wait for pending rendering jobs to complete
    queue.join()
    for i in range(num_threads):
        renderers[i].join()
...


Damit hab ich aber noch keine Erfahrungen gemacht. Eines der beiden Module sollte m.E. schon nötig sein.

Aber vielleicht klappt das bei Mapnik auch nur, weil die Postgres-Datenbank parallele Zugriffe erlaubt. Wie das bei phyghtmap organisiert ist, weiß nur der Entwickler :wink:

Gruß,
ajoessen