首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用blobs > 1GB在带sqlite后端的zodb再存储中?

如何使用blobs > 1GB在带sqlite后端的zodb再存储中?
EN

Stack Overflow用户
提问于 2020-10-07 11:34:44
回答 2查看 290关注 0票数 0

我试图通过再存储在sqlite后端保存一个blob > 1GB。下面的最低工作示例

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

最低工作实例:

代码语言:javascript
复制
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)

在新创建的对象的提交(在带有-块的__exit__方法)期间,发生错误,但有以下最后异常:

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

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

如何能够在没有使用共享blob目录的情况下使用relstorage将blob保存在sqlite后端中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-17 14:18:50

根据我的研究,你不能在这个设置中存储任意大小的气泡。您正在达到sqlite大小限制(https://www.sqlite.org/limits.html)。

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

  1. 不要将blob存储在sqlite中,例如使用共享的blob目录。
  2. 增加blob限制,使用sqlite的自定义构建(如上面的链接所述)。
  3. 减少你存储的东西的大小--例如压缩你的小块,或者把你的数据块成小块。
  4. 移到另一个存储后端。

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

票数 3
EN

Stack Overflow用户

发布于 2020-10-19 08:49:56

我正试图通过sqlite后端的重新存储来保存blob > 1GB。

一个相关的答案是 1。

我的建议是以不同的方式处理大气泡(例如,在2020年超过8到32 32MBytes )和小气泡。

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

小的内容将被保存为SQLITE blobs。

当然,您的数据库模式和使用它的Python代码都应该得到改进。注意数据库规范化

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64243173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档