I presume only the data structure pointer is static -- the vtab/cursors still 
need to be dynamic ..

I do not know why access to multiple separate instances of a virtual table 
would be serialized ...


-- 
˙uʍop-ǝpısdn sı ɹoʇıuoɯ ɹnoʎ 'sıɥʇ pɐǝɹ uɐɔ noʎ ɟı


> -----Original Message-----
> From: sqlite-users [mailto:sqlite-users-boun...@mailinglists.sqlite.org]
> On Behalf Of Dimitris Bil
> Sent: Tuesday, 4 July, 2017 09:19
> To: SQLite mailing list
> Subject: Re: [sqlite] Concurrent reads for VTs with in-memory data
> structures
> 
> Keith, thanks for your answer.
> 
> 
> I tried to implement it using multiple connections (each connection from a
> different thread) from a single process, but not only all access seems to
> be serialized, but the time spent when using threads is worse than the
> total time if all queries were executed sequentially. For example, I am
> testing the same query on an 8-core machine after I have created the
> static in-memory data structures. If I use one thread, the query takes
> about 20ms, whereas with two threads the time is about 60ms and with six
> threads about 500ms. I am getting the same behavior if I just try to
> execute a read from a regular table and also if I use the same connection
> for all threads. I have tried different SQLITE_THREADSAFE values, and also
> different values for PRAGMA synchronous and PRAGMA journal_mode, as well
> as trying to open the connections in read only mode, but nothing seems to
> work.
> 
> 
> I would appreciate any idea on how to make this work properly.
> 
> 
> ________________________________
> From: sqlite-users <sqlite-users-boun...@mailinglists.sqlite.org> on
> behalf of Keith Medcalf <kmedc...@dessus.com>
> Sent: Monday, July 3, 2017 6:36 PM
> To: SQLite mailing list
> Subject: Re: [sqlite] Concurrent reads for VTs with in-memory data
> structures
> 
> 
> If it is singleton data the I suppose you could keep a static pointer to
> the data structure, a static "use" counter, and a static mutex.
> 
> Then, for each connection (xConnect), lock the mutex, if the static use
> counter is zero then build the data structure and increment the use
> counter, then set the new connection to use the shared data structure,
> then release the mutex.
> 
> For each xDisconnect, lock the mutex, release that set of virtual table
> resources, decrement the counter and if the counter is zero, release the
> static data, then release the mutex.
> 
> This assumes that the data needs "reloading" after nothing is using it.
> If this is not the case you do exactly the same thing except to never
> rebuild the data structure after the first time, all you need (inside the
> mutex) on the xConnect it to build the static data structure if it does
> not exist, and on the xDisconnect simply release the virtual table
> resources (but never the shared static data structure).
> 
> This would mean, of course, that the data would be "static" across all
> connections in a process, but different processes would have their own
> static data.  If you need to release and rebuild the data structure this
> will happen only when no connection in the process is using connected to
> the data.
> 
> By diddling with the data attributes (basically making them all extern
> references to a specially constructed data segment) you could make the
> static data structure a singleton across multiple processes.  However this
> is not the default because static data segments are "process local" not
> "library local" ...
> 
> --
> ˙uʍop-ǝpısdn sı ɹoʇıuoɯ ɹnoʎ 'sıɥʇ pɐǝɹ uɐɔ noʎ ɟı
> 
> 
> > -----Original Message-----
> > From: sqlite-users [mailto:sqlite-users-boun...@mailinglists.sqlite.org]
> > On Behalf Of Dimitris Bil
> > Sent: Monday, 3 July, 2017 11:14
> > To: sqlite-users@mailinglists.sqlite.org
> > Subject: [sqlite] Concurrent reads for VTs with in-memory data
> structures
> >
> > I have some virtual tables that keep in-memory data structures. Data
> > loading is happening at table creation (xCreate and xConnect are the
> same)
> > and after that, during querying, only read access is needed. Queries do
> > not access any other tables. Is there a way to achieve concurrent
> > execution without having to keep multiple copies of each data structure?
> >
> > _______________________________________________
> > sqlite-users mailing list
> > sqlite-users@mailinglists.sqlite.org
> > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> 
> 
> 
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users



_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to