[Qgis-developer] save as spatialite very resource consuming
a.furieri at lqt.it
a.furieri at lqt.it
Thu Jan 30 09:29:53 PST 2014
Just few technical considerations (may be useful):
a) any SpatiaLite DB (even one completely empty) is usually
expected to consume about 4 MB.
this is because the complete EPSG dataset (geodesic parameters)
will be fully populated during the initial creation steps, and
there are about 4.000+ SRID definitions to be stored in the
"spatial_ref_sys" table.
Il 30/gen/2014 17:24 "kimaidou" <kimaidou at gmail.com> ha scritto:
> Could you try to use this commands in QGIS python console ?
> I have seen that the parameter 1 in the function initspatialmetadata
> is very important to have a very fast DB creation.
>
> from pyspatialite import dbapi2 as db
> conn=db.connect('/tmp/test.db')
> c=conn.cursor()
> sql = "select initspatialmetadata(1)"
> c.execute(sql) ; print [row for row in c]
>
b) surely yes: SQLite/SpatiaLite is a TRANSACTIONAL DBMS;
attempting to perform several thousands INSERTS not
opportunely contained within some BEGIN TRANSACTION statement
will certainly cause a painful slowness.
because in this case the SQL engine will then wait for every
single row to be physically written to the hard disk before
passing to process the next row ... an obvious performance
killer.
starting from the more recent versions of spatialite
(> 4.0) SELECT InitSpatialMetadata(1) will automatically
begin a transaction (1 stands for "with transaction")
c) may be I'm wrong about this, but from my personal tests
it looks like as if a new DB will unconditionally be
created for each SHP to be exported.
any attempt to select an already existing DB will simply
cause the whole DB to be overwritten.
this seems to be a rather extravagant implementation,
because after all the main advantage in using SpatiaLite
is in that you can easily store many hundredths vector
layers into the same DB file.
but I'm unable to see any button like "add this layer
to an already existing DB"
d) I was able to successfully save a POINT and a LINESTRING
SHP, but while attempting to save a MULTIPOLYGON SHP
I got an impressive list of severe errors complaining
about mismatching Geometries.
I strongly suspect that the layer type has been incorrectly
defined in this more complex case.
e) last but not least.
I read in the "save as" dialog this definition:
"SpatiaLite [OGR] [*.sqlite *.SQLITE"]
so I presume that this export operation isn't directly
handled by the spatialite's own data-provider, but is
indirectly handled by OGR.
anyway, AFAIK OGR nicely supports several specific
arguments allowing to finely control how to handle
TRANSACTIONs, allowing to create a new layer into
an already existing DB, and even allowing to nicely
control mixed-type Geoms (i.e. POLYGON/MULTIPOLYGON
from the same layer).
so I imagine that some kind of improvement should be
surely possible by carefully checking the arguments
passed to OGR (the actual implementation seems to be
rather simplistic and not fully adequate).
bye Sandro
More information about the Qgis-developer
mailing list