【问题标题】:How to use blobs > 1GB in zodb relstorage with sqlite backend?如何在带有 sqlite 后端的 zodb relstorage 中使用大于 1GB 的 blob?
【发布时间】:2021-01-22 08:36:30
【问题描述】:

我正在尝试通过relstorage 在 sqlite 后端保存一个 > 1GB 的 blob。以下最小工作示例

  • 删除之前创建的所有数据库以及 blob 目录,
  • 创建一个新数据库并
  • 将 1GB 的 blob 保存到数据库中。

最小工作示例:

import os
import shutil
from ZODB import blob, config

connectionString = """
%import relstorage
<zodb main>
<relstorage>
    blob-dir blob
    keep-history false
    cache-local-mb 0
    <sqlite3>
        data-dir .
    </sqlite3>
</relstorage>
</zodb>
"""

# cleaning up
for x in os.listdir():
    if "sqlite" in x:
        os.remove(x)

shutil.rmtree("blob", True)

# creating database
db = config.databaseFromString(connectionString)

with db.transaction() as conn:
    conn.root.blob = blob.Blob()
    with conn.root.blob.open("w") as f:
        f.write(b"\0" * 1024 ** 3)

在新创建的对象的提交期间(在 db.transaction with-block 的 __exit__ 方法中)发生错误并出现以下最终异常:

sqlite3.InterfaceError:错误绑定参数 2 - 可能是不受支持的类型。

保存大小为 1024 ** 2 的 blob 不会引发异常。

如何在不使用共享 blob 目录的情况下使用 relstorage 在 sqlite 后端保存 blob?

【问题讨论】:

  • 错误是重新分级数据类型而不是对象的大小。你会评论导致代码错误的行吗?
  • @Harkal 我澄清了问题中出现异常的确切点。如果使用了错误的类型,为什么它适用于较小的 blob(如 1024 ** 2)?
  • 我怀疑你达到了 sqlite 的存储限制。见sqlite.org/limits.html。如果它最多可以工作 10e9 个字节,那就是你的问题。如果是这样,您可以尝试使用更大限制的自定义构建。

标签: python sqlite blob zodb relstorage


【解决方案1】:

根据我的研究,您无法在此设置中存储任意大小的 blob。您正在达到 sqlite blob 大小限制 (https://www.sqlite.org/limits.html)。

在这个阶段你唯一的选择似乎是:

  1. 不要将 blob 存储在 sqlite 中,例如通过使用共享的 blob 目录。
  2. 使用自定义构建的 sqlite 增加 blob 限制(如上述链接中所述)。
  3. 减小存储内容的大小 - 例如通过压缩 blob 或将数据分块为更小的 blob。
  4. 移动到不同的存储后端。

就我个人而言,如果我使用 sqlite,我会倾向于使用共享 blob 目录,但你已经打折了这个选项,所以我认为你的选择是有限的。

【讨论】:

  • 将大块分割成多个小块怎么样?
  • 公平点。这是减少放入每条记录的大小的另一种方法。
  • 感谢您指出 sqlite 的限制。我同意你关于你建议的选择。我认为在我的上下文中,我会去拆分 blob。
【解决方案2】:

我正在尝试通过 relstorage 在 sqlite 后端保存一个 > 1GB 的 blob。

一个相关的答案是this one。

我的建议是处理不同的大 blob(例如 2020 年大于 8 到 32MBytes)和小 blob。

大型内容将被保存为文件,您的sqlite 数据库将知道(并存储)文件路径(例如某些生成的文件路径,例如 Linux 上的/var/tmp/bigblob1234。参见hier(7)inode(7).. .).

小内容将保存为 SQLITE blob。

当然,您的database schema 和使用它的 Python 代码都应该改进。请注意database normalization

【讨论】:

猜你喜欢
  • 2020-12-16
  • 1970-01-01
  • 2015-01-14
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多