Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re: Threads and DBD::SQLite?

by BrowserUk (Patriarch)
on Dec 15, 2013 at 09:32 UTC ( [id://1067216]=note: print w/replies, xml ) Need Help??


in reply to Threads and DBD::SQLite?

  1. How can I turn on the SQLite "Shared-Cache Mode" from DBI or DBD?

    Use a connect string of the form 'dbi:SQLite:dbname=file:memdb2?mode=memory&cache=shared'.

  2. Does it work as expected, if I fork off a thread, which opens SQLite shared memory? (Have anyone done this craziness with Perl before?)

    What are you expecting?

    (Kinda, but there are some issues. At least on windows.)

    For a start, retrieving a given number of records from a single thread&connection is nearly 2 orders of magnitude quicker than retrieving those same records via a connection made via a single connection in a separate thread.

    Running multiple clients in 2 separate threads cuts the time almost in half; and with 4 almost by 4; but it is still much faster to use a single thread/connection.

    This is true despite having deployed every speed-up pragma and option I can find.

  3. What is the recommended tcp/ip server module on CPAN for threaded programs?

    Personally, I don't use a module for tcp servers.

    Writing a threaded server that does what I need is pretty simple. Making someone else's implementation (if you can find one) do what I need it to do is always harder.

A few questions: What OS are you targeting? What does your data (schema) look like? What do your queries look like?


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

Replies are listed 'Best First'.
Re^2: Threads and DBD::SQLite?
by BerntB (Deacon) on Dec 15, 2013 at 16:15 UTC

    Ah, thank you! The exact string "cache=shared" gave some Google hits. This was fixed for DBD::SQLite this summer, it seems.

    For a start, retrieving a given number of records from a single thread&connection is nearly 2 orders of magnitude quicker than retrieving those same records via a connection made via a single connection in a separate thread.

    Two orders of magnitude slower using threads?! Sigh. Does it help to set "read uncommitted" on? (You do that in the connect string too?)

    A few questions: What OS are you targeting? What does your data (schema) look like? What do your queries look like?

    Honking big, multiprocessor Linux servers with Oracle and more memory than you can shake a stick at. :-) I'd like to replace an old C hack using a few GBytes of RAM for querying some subsets of a few tables really quick (quite a lot of work is required for some queries). The queries are data structures easily converted to SQL.

      Does it help to set "read uncommitted" on? (You do that in the connect string too?)

      Not in my experiments on windows. (No, it is a pragma. See below.)

      I do not have any great faith that my tests on windows will be reflected on *nix; so here is my test harness:

      I'd love to see the results from a few runs done' on other OSs.

      You can get threads::Q (my own, efficient, self-limiting queue implementation) from here.


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.

        UPDATE: numbers are partly wrong; see further discussion lower down in this thread

        I experimented a bit with this, on Centos 6.5. I had only a threaded perl 5.19.7 handy.

        Initially I got similar (disappointing) results, but then I found two problems with the test program:

        1. It turns out that after the "Create primary index"; block, a $dbh->commit is needed to get the index to be used/committed.

        2. A (much) higher rowcount $N gives more interesting results. From around N$ = 10_000 and upwards, the threaded version *is* (much) faster.

        For instance, for rowcount $N = 100_000:

        $ perl 1067204.pl Using minimum thread stack size of 16384 at /home/aardvark/perl-5.19/l +ib/5.19.7/x86_64-linux-thread-multi/threads.pm line 49. Took 6.262891 seconds (for Populate db with 100000 records) Took 0.121979 seconds (for Create primary index) Took 0.905479 seconds (for Retrieve the whole lot) 100000
        Took 0.099463 seconds (for Read all 100000 records using 4 threads)

        So, it was a good approach after all.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1067216]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others having an uproarious good time at the Monastery: (5)
As of 2025-03-26 14:54 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    When you first encountered Perl, which feature amazed you the most?










    Results (68 votes). Check out past polls.

    Notices?
    erzuuliAnonymous Monks are no longer allowed to use Super Search, due to an excessive use of this resource by robots.