dbm string lengths

Linus Chang somaking at yoyo.cc.monash.edu.au
Mon Apr 24 05:28:45 CEST 2000


Hi all,

I'm trying to use anydbm to store potentially long strings, and am running
into problems which seem to be caused by the length of the strings. (The
Python Ref Manual sec 3.11 on Shelve mentions that the length of pickled
objects should be small - how small?)

eg. the following code fragment:

import anydbm
import cPickle

db = anydbm.open("testingdb", "c")

print "Keys in db are: ",
for k in db.keys():
    print k,
list = []

for x in range(10000):
    list.append("Item number " + `x`)

db["item"] = cPickle.dumps(list)
db.sync()
db["item"] = "Small string"
db.sync()

-- Run the first time (no testingdb file exists), output as expected:
D:\Program Files\Python>python dbtest.py
Keys in db are:
-- Run a second time, the name of the key gets confused:
D:\Program Files\Python>python dbtest.py
Keys in db are:  itemm

(Changing the list to say a length of 10 yields results as expected.)

Alternatively, removing the line db["item"] = "Small string" causes the
following output on the second run:

D:\Program Files\Python>python dbtest.py
Keys in db are:
Traceback (innermost last):
  File "dbtest.py", line 8, in ?
    for k in db.keys():
bsddb.error: (22, 'Invalid argument')

-- Can anyone please help? I'm trying to store potentially long strings in
a dictionary, and need to store them to disk. I expect that entries will
be updated at up to 20 per second, so it's not really feasible to pickle
the whole dictionary to disk every time an individual entry is updated. In
addition, saving to disk asynchronously (eg. every X seconds) really isn't
my preference...

Thanks in advance,

Linus Chang





More information about the Python-list mailing list