The following pure python code does the same thing, memmapping the file when 
reading backwards ... works in Python 2 and 3, 32 and 64 bit.

Emulates what sqlite3 is doing as closely as I can manage.  As long as the mmap 
fits in memory it does not seem to affect performance.

---//---
from __future__ import absolute_import, print_function, division, 
unicode_literals

import random
import time
import os
import sys

if sys.version_info.major > 2:
    xrange = range

blocksize = 4096
blocks = 1024 * 4096

buffer = []
for i in xrange(blocksize):
    buffer.append(chr(random.randint(ord('A'), ord('z'))))
buffer = ''.join(buffer)

if sys.version_info.major > 2:
    buffer = buffer.encode('utf_8')

if os.path.exists('junk.dat'):
    print('Deleting junk.dat test file')
    os.unlink('junk.dat')

if not os.path.exists('junk.dat'):
    print('Creating 0 length junk.dat test file')
    f = open('junk.dat', 'wb')
    f.close()

f = open('junk.dat', 'rb+', buffering=0)

print('Writing File Forward', end=' ')
st = time.time()
for i in xrange(blocks):
    f.seek(i * blocksize)
    f.write(buffer)
f.flush()
os.fsync(f.fileno())
print(time.time() - st, 'seconds')
print()

def readforward():
    print('Reading File Forward', end=' ')
    st = time.time()
    for i in xrange(blocks):
        f.seek(i * blocksize)
        f.read(blocksize)
    f.flush()
    os.fsync(f.fileno())
    print(time.time() - st, 'seconds')
    print()

def readbackwards():
    print('Reading File Backward', end=' ')
    st = time.time()
    for i in xrange(blocks -1 ,-1, -1):
        f.seek(i * blocksize)
        f.read(blocksize)
    f.flush()
    os.fsync(f.fileno())
    print(time.time() - st, 'seconds')
    print()

readforward()
readbackwards()
readforward()
readbackwards()
readbackwards()
readforward()

f.close()
---//---


---
The fact that there's a Highway to Hell but only a Stairway to Heaven says a 
lot about anticipated traffic volume.


>-----Original Message-----
>From: sqlite-users [mailto:sqlite-users-
>boun...@mailinglists.sqlite.org] On Behalf Of David Raymond
>Sent: Monday, 18 June, 2018 07:10
>To: SQLite mailing list
>Subject: Re: [sqlite] .timer
>
>I haven't grasped all the fancy memory talk that's been going on
>here, but I have one request. Would you try the slowdown tests with a
>SQLite version compiled with...
>SQLITE_DEFAULT_MMAP_SIZE=0
>SQLITE_MAX_MMAP_SIZE=0
>...and see if anything changes? I started compiling with those
>options after some similar speed issues "back when" and things seem
>to have cleared up since then. I'm curious if it's because I added
>that or if it's just a coincidence.
>_______________________________________________
>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