[GRASS-dev] [GRASS GIS] #2033: Moving g.pnmcomp to lib/display to improve render performance of wxGUI
GRASS GIS
trac at osgeo.org
Tue Jul 23 03:16:09 PDT 2013
#2033: Moving g.pnmcomp to lib/display to improve render performance of wxGUI
----------------------------------------------+-----------------------------
Reporter: huhabla | Owner: grass-dev@…
Type: enhancement | Status: new
Priority: major | Milestone: 7.0.0
Component: wxGUI | Version: svn-trunk
Keywords: display, Python, multiprocessing | Platform: All
Cpu: All |
----------------------------------------------+-----------------------------
Comment(by huhabla):
I am not fully convinced using the mmap() approach for IPC. It is not
guaranteed that mmap() is faster then the usual file I/O.[1]
I have written a small python script to test the performance of d.rast and
d.vect using the north carolina sample dataset. The script is attached. I
am using the PNG and Cairo driver, switching mmap on and of for different
window sizes. In addition i call the d.rast (1x) and d.vect (2x) modules
in parallel to measure a render speed gain. The composition is still
missing, but i will add the PIL approach available in the grass wiki with
python.mmap support. Here is the script:
{{{
# -*- coding: utf-8 -*-
from grass.pygrass import modules
import os
import time
parallel = [True, False]
drivers = ["png", "cairo"]
mmap_modes = ["FALSE", "TRUE"]
sizes = [1024, 4096]
def render_image(module, driver="png", pngfile="test.png",
size=4096, mapped="TRUE"):
os.putenv("GRASS_RENDER_IMMEDIATE", "%s"%driver)
os.putenv("GRASS_PNGFILE", "%s"%pngfile)
os.putenv("GRASS_WIDTH", "%i"%size)
os.putenv("GRASS_HEIGHT", "%i"%size)
os.putenv("GRASS_PNG_MAPPED", "%s"%mapped)
module.run()
def composite_images(files):
pass
def main():
# Set the region
modules.Module("g.region", rast="elevation", flags="p")
for finish in parallel:
if finish:
print("*** Serial runs")
else:
print("*** Parallel runs")
# Setup the modules
rast = modules.Module("d.rast", map="elevation", run_=False,
quiet=True, finish_=False)
vectB = modules.Module("d.vect", map="streams", width=1,
color="blue",
fcolor="aqua", type=["area","line"],
run_=False, quiet=True, finish_=finish)
vectA = modules.Module("d.vect", map="roadsmajor", width=2,
run_=False, quiet=True, finish_=finish)
count = 0
for driver in drivers:
for mode in mmap_modes:
for size in sizes:
start = time.time()
count += 1
files = []
if mode == "TRUE":
rast_file = "rast.bmp"
vectA_file="vectA.bmp"
vectB_file="vectB.bmp"
else:
rast_file = "rast.png"
vectA_file="vectA.png"
vectB_file="vectB.png"
render_image(rast, driver=driver, pngfile=rast_file,
size=size, mapped=mode)
render_image(vectA, driver=driver, pngfile=vectA_file,
size=size, mapped=mode)
render_image(vectB, driver=driver, pngfile=vectB_file,
size=size, mapped=mode)
files.append(rast_file)
files.append(vectA_file)
files.append(vectB_file)
# Wait for processes
rast.popen.wait()
vectA.popen.wait()
vectB.popen.wait()
# Composite the images
composite_images(files)
for file in files:
os.remove(file)
elapsed = (time.time() - start)
print("*** Run %i Driver=%s mmap=%s Size=%i
time=%f"%(count,
driver,
mode,
size,
elapsed))
main()
}}}
The result of the benchmark:
{{{
GRASS 7.0.svn (nc_spm_08_grass7):~/src > python display_bench.py
projection: 99 (Lambert Conformal Conic)
zone: 0
datum: nad83
ellipsoid: a=6378137 es=0.006694380022900787
north: 228500
south: 215000
west: 630000
east: 645000
nsres: 10
ewres: 10
rows: 1350
cols: 1500
cells: 2025000
*** Serial runs
*** Run 1 Driver=png mmap=FALSE Size=1024 time=0.796055
*** Run 2 Driver=png mmap=FALSE Size=4096 time=3.389201
*** Run 3 Driver=png mmap=TRUE Size=1024 time=0.449877
*** Run 4 Driver=png mmap=TRUE Size=4096 time=3.723065
*** Run 5 Driver=cairo mmap=FALSE Size=1024 time=0.824797
*** Run 6 Driver=cairo mmap=FALSE Size=4096 time=2.632125
*** Run 7 Driver=cairo mmap=TRUE Size=1024 time=0.542321
*** Run 8 Driver=cairo mmap=TRUE Size=4096 time=2.276822
*** Parallel runs
*** Run 1 Driver=png mmap=FALSE Size=1024 time=0.756147
*** Run 2 Driver=png mmap=FALSE Size=4096 time=3.113990
*** Run 3 Driver=png mmap=TRUE Size=1024 time=0.530959
*** Run 4 Driver=png mmap=TRUE Size=4096 time=3.355732
*** Run 5 Driver=cairo mmap=FALSE Size=1024 time=0.865963
*** Run 6 Driver=cairo mmap=FALSE Size=4096 time=2.358270
*** Run 7 Driver=cairo mmap=TRUE Size=1024 time=0.566976
*** Run 8 Driver=cairo mmap=TRUE Size=4096 time=1.934245
}}}
There is no mmap() speed improvement for the PNG driver for large window
sizes?
I will investigate this further.
[1] http://lists.freebsd.org/pipermail/freebsd-
questions/2004-June/050371.html
--
Ticket URL: <http://trac.osgeo.org/grass/ticket/2033#comment:4>
GRASS GIS <http://grass.osgeo.org>
More information about the grass-dev
mailing list