我希望从同时运行的多个Python脚本访问一个惟一的dict
(key/value)数据库。在
如果script1.py
更新d[2839]
,那么script2.py
在几秒钟后查询{
我曾考虑过使用SQLite,但从多个进程并发写/读似乎不是SQLite的强项(假设script1.py
刚刚修改了d[2839]
,那么{
当我想刷新修改(但它是rather tricky to do)并使用json.dump
进行序列化,然后尝试检测修改,如果有修改,使用json.load
重新加载,等等。。。哦,不,我在重新发明轮子,重新发明一个特别低效的键/值数据库!
redis看起来像是一个解决方案,但是it does not officially support Windows,同样适用于leveldb。
多个脚本可能希望在完全相同的时间编写(即使这是非常罕见的事件),有没有一种方法让数据库系统来处理这一点(感谢一个锁定参数?默认情况下,SQLite似乎不能这样做,因为"SQLite supports an unlimited number of simultaneous readers, but it will only allow one writer at any instant in time.")
对此,Python的解决方案是什么?
注意:我在Windows上,dict应该最多有1M个项目(键和值都是整数)。在
在redis出现之前,有Memcached(在windows上运行)。 这是一个教程。https://realpython.com/blog/python/python-memcache-efficient-caching/
除了SQLite之外,大多数嵌入式数据存储都没有针对并发访问进行优化,我对SQLite的并发性能也很好奇,所以我做了一个基准测试:
在我的4核macOS机箱上的结果,SSD卷:
^{pr2}$在8核windows server 2012云服务器上的结果,SSD卷:
^{3}$结果表明,不管并发性如何,总体吞吐量都是一致的,而且SQLite在windows上比macOS慢,希望这能有所帮助。在
由于SQLite write lock是针对数据库的,为了获得更多的TPS,可以将数据分区到多个数据库文件:
在我的mac上有20个分区的结果:
总TPS高于单个数据库文件。在
我考虑两个选项,都是嵌入式数据库
SQlite
正如回答here和{a2}应该没问题
伯克利db
link
它完全是为你设计的
它很强大,已经存在了很多年甚至几十年了
启动
redis
/memcached
/任何其他需要sysops参与的基于socket的完整服务器,对于任务来说,在同一个机器上的两个脚本之间交换数据是一个开销相关问题 更多 >
编程相关推荐