20 dec 2015, 14:29, sanhua.zh:
> Here is the test result for selecting 100,000 items in original test
> case.
>
>
> shared cache mode
> 2015-12-20 21:24:58.714 Test[1126:11609] cost 2.173480
> 2015-12-20 21:24:58.714 Test[1126:11610] cost 2.173449
> 2015-12-20 21:24:58.714 Test[1126:11608] cost 2.173768
> 2015-12-20 21:24:58.714 Test[1126:11611] cost 2.173169
>
>
> without shared cache mode
> 2015-12-20 21:28:49.647 Test[1286:13077] cost 0.028914
> 2015-12-20 21:28:49.647 Test[1286:13078] cost 0.028914
> 2015-12-20 21:28:49.647 Test[1286:13079] cost 0.028964
> 2015-12-20 21:28:49.647 Test[1286:13076] cost 0.028958
>
>
> May be your python code does not run the same thing as mine, I am
> poor in python so that I could not figure it out.
Indeed, I had changed the query to just scan the table in the database
and not return all rows. Now I chaged that and also set the
corresponding number of rows. Still cache sharing does not make such a
mega differencr. Below are the timings.
I have no clu now for your mega difference.
SQLite version? 3.8 here
hardware? I have (only) Mac OS X 10.5.8 with a 1.22 GHz PowerPC
Timings for default mode:
$ python3 larry3.py [B
sqlite version 3.8.3.1
cache sharing 0 cache size 2000 rowcount 100000
after split 0.0037369728088378906
after start 0.8668131828308105
steps 100000 connect+fetch 4.39 connect 0.0
steps 100000 connect+fetch 4.52 connect 0.0
steps 100000 connect+fetch 4.62 connect 0.0
steps 100000 connect+fetch 4.51 connect 0.0
elapsed 5.21
Timings in shared cache mode:
sqlite version 3.8.3.1
cache sharing 1 cache size 2000 rowcount 100000
after split 0.0035581588745117188
after start 0.7083160877227783
steps 100000 connect+fetch 6.4 connect 0.0
steps 100000 connect+fetch 6.17 connect 0.0
steps 100000 connect+fetch 6.56 connect 0.0
steps 100000 connect+fetch 6.46 connect 0.0
elapsed 6.85
Python script:
import random, os, time, threading
import sqlite3 as sqlite
print ("sqlite version", sqlite.sqlite_version)
TESTDB='larry.tmp'
SHARED=0
SIZE=2000
ROWCOUNT=100000
print('cache sharing', SHARED, 'cache size', SIZE, "rowcount", ROWCOUNT)
sqlite.enable_shared_cache(SHARED)
def connect():
con= sqlite.Connection (TESTDB, isolation_level=None,
check_same_thread=0)
con.execute ("pragma cache_size=%i"%(SIZE,))
return con
def e_str (e):
" format exception as string "
return "%s: %s" % (e.__class__.__name__, e)
class Testthread (threading.Thread):
"""
execute query in a thread
"""
def __init__ (self, qq, con = None):
self.con = con
self.qq = qq
self.out = "thr%i.out" % id (self)
open (self.out, 'w').close ()
os.remove (self.out)
threading.Thread.__init__ (
self,
target=self.__target,
)
def start (self):
threading.Thread.start (self)
for retry in range (5):
time.sleep (2 ** retry * .05)
if os.access (self.out, os.R_OK):
break
else:
print("Testthread: spoolfile does not appear")
time.sleep (.10) # for the SQL to start
def __target (self):
subt0=time.time()
if not self.con:
self.con = connect ()
dt1=round(time.time()-subt0,2)
f = open (self.out, 'w')
try:
try:
n=0
for q in self.qq.split (';'):
i=None
for i in self.con.execute(q):
n+=1
continue
f.write (str(i)+'\n') # write last line only
dt2=round(time.time()-subt0,2)
print("steps", n, "connect+fetch", dt2, "connect", dt1)
except Exception as e:
f.write (e_str (e) + '\n')
finally:
f.close()
self.con.close ()
def join (self, timeout=None):
if timeout is not None:
threading.Thread.join (self, timeout)
else:
timeout = 7.5 # respond to keyboard interrupts
while self.isAlive ():
threading.Thread.join (self, timeout)
return self
def get_result (self):
try:
return open (self.out, 'r').read ().strip ()
except IOError as e:
return None
def main ():
# create some test data
con = connect ()
try:
n=con.execute("select count(*) from test").fetchone()[0]
except sqlite.OperationalError:
n=None
con.close()
if n!=ROWCOUNT:
print ("n!=ROWCOUNT",n ,ROWCOUNT, "creating new test
database..")
open (TESTDB, 'w').close ()
os.remove (TESTDB)
con = connect ()
con.execute ("create table test (id integer)")
con.execute ("begin")
con.executemany(
"insert into test(id) values(:1)",
((i+1,) for i in range(ROWCOUNT)))
con.execute ("end")
con.close ()
print ("done")
qq="SELECT id FROM test"
t0=time.time()
tthh=[]
for i in range(4):
con = None ###connect()
tthh.append (Testthread (qq, con))
print("after split", time.time()-t0)
for th in tthh:
th.start ()
print("after start", time.time()-t0)
ckres0="(%i,)"%(ROWCOUNT,)
for th in tthh:
res=th.join ().get_result().split('\n')
if res[0]!=ckres0:
print ("result", res[0],'!=', ckres0)
dt=round(time.time()-t0,2)
print('elapsed', dt)
if __name__ == "__main__":
main ()