run*_*eks 2 python memory-leaks leveldb
所以我写了索引的Bitcoin通过地址blockchain,使用性LevelDB数据库(Python脚本PY-性LevelDB),它会持续吃越来越多的内存,直到它崩溃.我已经在下面的代码示例中复制了该行为.当我运行代码时,它继续使用越来越多的内存,直到它耗尽了我系统上的可用RAM并且进程被杀死或抛出"std :: bad_alloc".
难道我做错了什么?我一直在写批处理对象,并且每隔一段时间提交一次,但即使我在WriteBatch对象中提交数据,内存使用量也在不断增加.我甚至在编写后删除了WriteBatch对象,所以据我所知它不会导致内存泄漏.
我的代码是以错误的方式使用WriteBatch还是py-leveldb中存在内存泄漏?
代码需要运行py-leveldb,从这里获取:https://pypi.python.org/pypi/leveldb
警告:如果运行时间过长,运行此代码将耗尽您的内存.不要在一个关键的系统上运行.此外,作为脚本运行中,我的系统在此文件夹中包含约1.5GB值得数据库文件的内存枯竭型之前,将数据写入到一个文件夹在同一文件夹(它结束了耗时超过3GB的内存).
这是代码:
import leveldb, random, string
RANDOM_DB_NAME = "db-DetmREnTrKjd"
KEYLEN = 10
VALLEN = 30
num_keys = 1000
iterations = 100000000
commit_every = 1000000
leveldb.DestroyDB(RANDOM_DB_NAME)
db = leveldb.LevelDB(RANDOM_DB_NAME)
batch = leveldb.WriteBatch()
#generate a random list of keys to be used
key_list = [''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(KEYLEN)) for i in range(0,num_keys)]
for k in xrange(iterations):
#select a random key from the key list
key_index = random.randrange(0,1000)
key = key_list[key_index]
try:
prev_val = db.Get(key)
except KeyError:
prev_val = ""
random_val = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(VALLEN))
#write the current random value plus any value that might already be there
batch.Put(key, prev_val + random_val)
if k % commit_every == 0:
print "Comitting batch %d/%d..." % (k/commit_every, iterations/commit_every)
db.Write(batch, sync=True)
del batch
batch = leveldb.WriteBatch()
db.Write(batch, sync=True)
Run Code Online (Sandbox Code Playgroud)
你应该真的尝试Plyvel.请参阅https://plyvel.readthedocs.org/.它具有更清晰的代码,更多的功能,更快的速度和更多的测试.我用它来批量写入相当大的数据库(20+ GB)而没有任何问题.
(完全披露:我是作者.)