我有这样的数据结构:
{
'key1':[
[1,1,'Some text'],
[2,0,''],
...
],
...
'key99':[
[1,1,'Some text'],
[2,1,'More text'],
...
],
}
每个键的大小只有100个键和100个列表。
我喜欢存储它并根据键检索它(整个列表)。这适用于流量不是很高的Web服务器。但是,后端必须处理并发读写。
如何以安全的方式执行此操作,而无需编写太多代码?
我认为在SQLite中存储pickled对象是一种可能的解决方案。
有更好的方法吗?
答案 0 :(得分:0)
答案取决于瓶颈在哪里。如果您的进程受I / O限制(即它不会占用处理所有请求的大量CPU时间),那么您应该查看像Twisted这样的事件驱动框架。在这种情况下,您可以将数据存储在普通字典中,因为在给定时间只有一个线程可以访问它。
如果您的进程是CPU密集型的并且您想要利用多个内核,则需要使用多个Python进程,因为每个Python进程都将保存一个GIL(全局解释器锁),并且多个线程无法执行Python代码同一个过程同时进行。在这种情况下,一个非常简单的选择是使用共享存储,例如memcached。
答案 1 :(得分:0)
Python pickles不是为并发访问而创建的。如果您可以创建一个长期存在的进程,则可以简单地使用内存结构进行操作,并使用单个pickle文件来保持持久性。您需要确保捕获信号以确保写入pickle文件!
更灵活的解决方案是sqlite。 sqlite网页brags:“我们知道没有其他嵌入式SQL数据库引擎支持与SQLite一样多的并发性。”这里的问题是你很可能错误地设置了数据库设计(没有违法行为)。我会创建一个“键”表和一个“列表”表(建议使用更有意义的名称!),外键从列表指向键。确保键有索引!
如果列表不是固定长度,则应创建第三个表来保存这些值,外键指向列表。