我的数据最好用树表示。序列化结构是最有意义的,因为我不想每次都对它进行排序,这样我就可以对数据进行持久的修改。
另一方面,这棵树将从不同机器上的不同进程访问,所以我担心阅读和写作的细节。基本搜索没有对该主题产生太多影响。
我正在考虑将更改队列应用于树,然后让树按提交顺序执行。我想在尝试解决它们之前我会问我的问题是什么。
答案 0 :(得分:1)
没有尝试,我很确定答案是:
另外,你提到了搁置。从搁置文件:
shelve模块不支持并发读/写访问 搁置的物体。 (多个同时读取访问是安全的。)何时 一个程序有一个可以写作的架子,没有其他程序应该有 它可供阅读或写作。 Unix文件锁定可以用来解决 这,但这在Unix版本中有所不同,需要知识 关于使用的数据库实现。
就个人而言,此时,您可能希望使用像Redis这样的简单键值存储来进行某种乐观锁定。
答案 1 :(得分:0)
您可以尝试klepto
,它提供了一个sql数据库的字典界面(使用sqlalchemy
下的封面)。如果您选择将数据保留到mysql
,postgresql
或其他可用数据库(sqlite
除外),那么您可以让两个或更多人同时访问数据或拥有两个数据线程/进程访问数据库表 - 并让数据库管理并发读写。将klepto
与数据库后端一起使用将在并发访问下以及直接访问数据库时执行。如果您不想使用数据库后端,klepto
也可以写入磁盘 - 但是在写入磁盘时可能会发生冲突 - 即使klepto
使用“复制 - on-write,然后替换“在磁盘上处理文件时最小化并发冲突的策略。使用文件(或目录)后端时,由于策略klepto
用于保存写入磁盘,因此仍然会处理问题1-2-3。此外,klepto
可以使用内存缓存层来实现快速访问,其中来自磁盘(或数据库)后端的加载/转储可以按需完成,也可以在内存缓存到达用户时完成 - 确定的大小。
具体来说:(1)两者同时送达。 (2)如果一个用户进行编辑,则另一个用户看到更改 - 但是如果第二个用户正在使用内存中缓存层,则该更改可能会“延迟”。 (3)多个同时写入不是问题,因为klepto
让NFS或sql数据库处理“copy-on-write,then replace”更改。
klepto.archvives
的字典界面也可以在提供LRU
缓存(以及LFU
和其他)的装饰器表单中使用,所以如果你有一个正在生成/访问的函数数据,连接存档非常简单 - 您可以通过磁盘或数据库后端进行记忆。
使用klepto
,您可以选择几种不同的序列化方法来加密数据。您可以klepto
将数据转换为字符串,或使用散列算法(如md5
),或使用pickler(如json
,pickle
或{{1 }})。
您可以在此处dill
获取https://github.com/uqfoundation/klepto