问题标签 [zodb]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
637 浏览

python - zodb:数据库冲突失败

我有一个服务器和一个客户端。

客户端发送请求。该请求具有与其关联的某个键,例如a-1, a-2, b-1, b-4

如果同一密钥的两个请求同时出现,则会出现冲突错误,因为正在修改相同的数据结构。

我可以让客户端简单地不一次发送相同密钥的两个请求。但是,我希望这个系统也能与多个客户一起工作。让客户端协调他们发送到服务器的内容似乎很愚蠢。相反,如果该密钥已被修改,我希望服务器简单地阻止对该密钥的请求,直到完成具有相同密钥的其他请求。

为此,我创建了一个锁定系统。在服务器上的功能开始时,我这样做:

哪里KEY_LOCKS是 dict 映射键到threading.Locks。之后是修改持久数据结构的代码。

我假设会发生的是,如果一个请求进入一个已经被处理的密钥,它会在获取锁时阻塞。只有当较早的请求已经提交(因此超出任何冲突错误)时,新请求才会恢复。在获取锁之前,请求不会发生任何冲突。

大多数请求都可以正常工作:

但是,发送相同的密钥时仍然存在问题,即使锁定似乎有效:

然后请求重试。请注意,q-q lock仅在成功提交后才获得。

是什么赋予了?为什么这个系统不能防止冲突错误?我的假设在哪里不正确?


编辑:好吧,如果在transaction.get().addAfterCommitHook(after_commit_hook)我放的那一行之前transaction.begin(),它可以工作。对于我的生活,我无法弄清楚为什么。在该transaction.begin()行之前,我的整个代码是:

这解决了我的问题,但我没有把它作为答案,因为我仍然想知道:如果我之前没有开始新的交易,为什么会出现冲突错误?

0 投票
4 回答
670 浏览

python - ZODB 等价于有序 dict (odict?)

我正在做一些 PloneFormGen 工作。目前 PloneFormGen 在内部将输入的表单条目存储为元组,而没有关联的列信息。如果添加了新列(表单域),则现有数据将变为无效。

这可以很容易地避免将数据存储在有序字典中,该字典保留输入的列顺序和列 ID。

ZODB 是否具有等效于有序字典的数据类型?如果可能,即使使用匹配的 API(类似 Python dict 的项目操作和访问)?

0 投票
2 回答
178 浏览

easy-install - 如何使用 easy_install 安装特定的 .egg 文件

我正在尝试在新机器上安装 ZODB。我想匹配我在另一台机器上的相同安装(最新的 ZODB 无法使用 easy_install 正确安装)。我有原始的easy-install.pth,我想在新机器上安装:

有没有办法在新机器上安装这些确切的文件?我尝试将文件夹复制到新机器上,但 python 没有看到该模块。

0 投票
1 回答
363 浏览

session - Zope 2 冲突较少的会话管理器

Zope2 会话文档:“冲突错误将由 Zope 自动重试,最终用户永远不会看到。”

然而,尽管我认为我拥有适合高流量部署的最佳设置(ZEO 上会话数据的临时存储,由四个客户端共享,具有相同设置的 zope 实例),最终用户仍然会收到数据库冲突错误。

搜索邮件列表,这似乎是 Zope 基于 OOBTree 实现会话数据的常见问题。有人建议使用 repoze.session,但自 2009 年以来就不受支持。

修复 BTree / TransientObject 冲突错误的任何其他方法?我是否必须更改 session_data 的默认设置(数据对象超时值、超时分辨率、最大子对象数)?

0 投票
1 回答
277 浏览

plone - 巨大的 PersistentMapping 持久保存在 Plone 中的每个内容对象上

每次保存对象时,都会在实例日志中收到以下警告:

事实上,储蓄需要很长时间。在事务提交期间将 pdb 放入打印触发器的位置,并确实向我展示了 PersistentMapping 的写入类型:

似乎我的站点中的每个内容对象都有一个条目。由于在提交期间发生这种情况,我看不到该映射的存储位置。

有没有人有一个指针可能是什么?

非常感谢!亚历克斯

0 投票
1 回答
882 浏览

python - 使用烧瓶 zodb 的 LockError

我在使用. _ _ 每次我尝试使用数据库例如设置默认值时:mod_wsgi

或在这样的视图中:

我收到以下错误:

该应用程序在开发环境中运行良好,我不认为存在权限问题,因为我尝试设置:

并引发了同样的异常。我不明白为什么会发生这种情况以及如何避免这种错误。有任何想法吗?

0 投票
1 回答
84 浏览

python - python:是否可以检测到我是否在 paste shell 中?

我正在使用 Python + ZOPE/ZODB/Repoze BFG(首字母缩略词都变得相当混乱)+ paste。

我有一个可以通过以下方式运行的贴纸外壳:

一切正常。然而,我有一堆被打开的监控东西——将调试信息打印到标准输出的线程——当我刚刚启动 shell 时,它们真的不需要运行。是否有可能以某种方式检测启动代码是否在 shell 中运行?因此,如果代码检测到 shell打开,它将启动这些线程,如果 shell打开,则不会。

0 投票
2 回答
2703 浏览

python - 何时在 ZODB 中提交数据

我正在尝试处理由以下代码生成的数据:

由于字典很大(10000 个键 X 10000 个列表,每个包含 3 个元素),因此很难将其保存在内存中。我一直在寻找一种解决方案,它在生成键:值(以列表的形式)对后立即存储它们。这里建议,以特定格式(Python)编写和阅读字典,将 ZODB 与 Btree 结合使用。

如果这太天真了,请容忍我,我的问题是,什么时候应该调用transaction.commit()提交数据?如果我在内循环结束时调用它,则生成的文件非常大(不知道为什么)。这是一个片段:

如果我在两个循环之外调用它怎么办?就像是:

在我调用 transaction.commit() 之前,所有数据都会保存在内存中吗?同样,我不知道为什么,但这会导致磁盘上的文件变小。

我想最小化内存中保存的数据。任何指导将不胜感激 !

0 投票
2 回答
6287 浏览

python - Python:如何在未排序的列表中找到大于某个数字的所有项目(大数据集)

虽然,其他人也问过类似的问题,例如。在这里,但它们略有不同,并没有真正解决我的问题,所以我又来了。

我有 N 个列表(N>20,000),每个列表包含 M 个列表(M >20,000),方式如下(数据是虚拟的):

数据未排序。逐个迭代阈值列表,例如Threshold =[2, 3, 5, 7, 8],在中间元素上应用阈值时,我想为所有键提取大于阈值的所有元素。例如。根据我上面写的数据,Threshold = 2会产生

对于其他阈值也是如此。由于列表太多,我的观察是排序会导致大量开销,因此我想避免它。在python中执行此操作的最佳方法是什么?另一个重要的一点是,我自己构建数据,所以可能有更好的数据结构来存储数据。我目前将数据以容器的形式存储在PersistentListBtreeZODB这是在此处建议的。以下是用于它的代码片段:

关于什么应该是最有效的方法的任何建议?首先排序确实是最佳方式吗?

0 投票
1 回答
285 浏览

python - 修改 ZODB 中的数据

按照此处给出的建议,我使用 ZODB 存储了我的数据,由以下代码创建:

现在,我想(在一个单独的模块中)(1)修改存储的数据并(2)对其进行排序。以下是我使用的代码:

但是,用于编辑值的代码会占用所有内存(永远不会进行排序)。我不确定这是如何工作的,但我感觉我的代码存在严重问题,ZODB 将所有内容都拉入内存,因此出现了问题。什么是实现预期效果的正确方法,即在 ZODB 中存储元素的替换和排序而不会遇到内存问题?代码也很慢,建议加快速度吗?

[注意:我没有必要将这些更改写回数据库]

编辑通过在内部循环之后添加命令似乎对内存使用有所改善connection.cacheMinimize(),但是在一段时间后再次消耗了整个 RAM,这让我感到困惑。