1
likuku 2013-10-18 11:27:13 +08:00
mongodb 吧
|
2
Golevka 2013-10-18 12:03:49 +08:00 1
你可以想办法一次读取dict然后常驻内存, 之后再次运行就不用每次从磁盘重新读文件了.
|
3
yelite 2013-10-18 12:09:54 +08:00
sqlite,建好索引速度应该还是很快的
|
8
clino 2013-10-18 13:42:46 +08:00
看起来用数据库比较合适,可以用sqlite试试看,用python的话可以用sqlchemy操作.
|
9
clino 2013-10-18 13:52:33 +08:00
上面写错了,是 sqlalchemy
|
10
shadowind 2013-10-18 14:37:27 +08:00
好像cpickle会快点~
|
13
czheo 2013-10-18 20:47:03 +08:00
lz可以看看gdbm,local key value storage
|
15
monkeylyf 2013-10-18 23:59:07 +08:00
pickle
|
16
11 2013-10-19 00:10:48 +08:00
pickle 的话,你用的是 pickle 还是 cPickle? cPickle 应该会快一些。
|
17
czheo 2013-10-19 19:16:51 +08:00
我对pickle, cpickle和gdbm做了下简单测试,读写400万条数据,分别都做3次测试,结果如下:
############################## 先让我们看下,cpickle 1st round: write: 16.770192 s read: 12.779067 s 2nd round: write: 16.756108 s read: 12.965158 s 3rd round: write: 16.915888 s read: 13.199477 s ############################## 然后是,pickle 1st round: write: 56.681483 s read: 60.116578 s 2nd round: write: 55.843203 s read: 57.877304 s 3rd round: write: 56.738194 s read: 59.350219 s ############################## 最后是,gdbm 1st round: write: 45.324347 s read: 5.723811 s 2nd round: write: 10.359093 s read: 5.929302 s 3rd round: write: 10.596857 s read: 6.014081 s ############################## 生成的文件大小如下: 330M Oct 19 19:57 gdbm.db 153M Oct 19 19:46 cpickle.db 153M Oct 19 19:53 pickle.db 可以看出,除去gdbm第一次建立数据库需要花费更多时间外,读写都比cpickle快很多。 最重要的一点是: 虽然没有具体做内存方面的测试, 但cpickle每次都要读取整个文件载入内存,效率显然不行。 gdbm属于kvs,对这方面做了大量优化,内存使用方面应该可以完胜。 实际跑测试程序的时候,用top看了一眼内存使用,肉眼观测,pickle/cpickle都要用掉1G左右的,而gdbm内存使用几乎没有什么变化。 如果需要以后添加修改数据,cpickle需要重写整个文件,而gdbm可以动态添加修改某条纪录,使用起来显然更方便。 最后,如果多个process去写同一个文件,cpickle无法保证安全性可能会导致文件损坏。而gdbm有自动lock机制,安全方面要好很多。 另外,个人觉得sqlite其实也是一个不错的选择,性能上可能不及gdbm,但更flexible。 结论: 推荐gdbm |
18
czheo 2013-10-19 19:20:49 +08:00
附上测试代码 供lz参考
############## cpickle.py ################# import cPickle as pickle import time start = time.clock() db = {}; for i in range(4000000): db[str(i)] = str(i) f = open("cpickle.db", "wb") pickle.dump(db, f) f.close() end = time.clock() print "write: %f s" % (end - start) start = time.clock() f=open("cpickle.db", "rb") db = pickle.load(f) for i in db: if int(i) % 1000000 == 0: print i, db[i] f.close() end = time.clock() print "read: %f s" % (end - start) ############## gdbm.py ################# import gdbm import time start = time.clock() db = gdbm.open("gdbm.db", "c") for i in range(4000000): db[str(i)] = str(i) db.close() end = time.clock() print "write: %f s" % (end - start) start = time.clock() db = gdbm.open("gdbm.db", "r") for i in db.keys(): if int(i) % 1000000 == 0: print i, db[i] db.close() end = time.clock() print "read: %f s" % (end - start) ############## pickle.py ################# import pickle import time # timmer code start = time.clock() # real code db = {}; for i in range(4000000): db[str(i)] = str(i) f = open("pickle.db", "wb"); pickle.dump(db, f) f.close() #timmer code end = time.clock() print "write: %f s" % (end - start) start = time.clock() f=open("pickle.db", "rb") db = pickle.load(f) for i in db: if int(i) % 1000000 == 0: print i, db[i] f.close() end = time.clock() print "read: %f s" % (end - start) |
19
stefwoo 2013-10-20 22:40:43 +08:00
@czheo useful!many thanks!
|
20
v88ex 2013-10-21 13:09:43 +08:00
用radis然后Python连接,算吗?
|