如何在带有sqlite后端的zodb重新存储中使用大于1GB的blob?

我正在尝试通过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目录的情况下使用重新存储将blob保存在sqlite后端中?

saigemarket 回答:如何在带有sqlite后端的zodb重新存储中使用大于1GB的blob?

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

在此阶段,您唯一的选择似乎是:

  1. 请勿将斑点存储在sqlite中,例如通过使用共享的Blob目录。
  2. 使用自定义版本的sqlite(如上面的链接所述)来提高blob限制。
  3. 减小存储空间的大小-例如通过压缩blob或将数据分块为较小的blob。
  4. 移动到另一个存储后端。

就我个人而言,如果我使用的是sqlite,我倾向于使用共享的blob目录,但是您不喜欢该选项,所以我认为您的选择是有限的。

,

我试图通过在sqlite后端中的重新存储来保存1GB以上的blob。

一个相关的答案是this

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

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

少量内容将另存为SQLITE blob。

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

本文链接:https://www.f2er.com/1438342.html

大家都在问