【问题标题】:Retrieve files from MongoDB using pymongo and gridfs for files larger than 16mb对于大于 16mb 的文件,使用 pymongo 和 gridfs 从 MongoDB 中检索文件
【发布时间】:2020-10-23 02:34:09
【问题描述】:

因此,我尝试从 python 应用程序在 Azure Cosmos Emulator 上的本地数据库上上传大于 16mb 的数据。上传是完美的,它与项目一起创建了块。我遇到的问题是在下载上。

path = "eye1.zip"
fs = gridfs.GridFS(db)
with open(path, 'rb') as file1:
    grid = fs.put(file1)
    eye = fs.get(grid)
    print(eye.read())

我在 .read() 命令中一直得到的错误是pymongo.errors.ProtocolError: Message length (12753158) is larger than server max message size (4194304)。那么下载我刚刚上传到设备的数据的正确程序是什么?为什么会出现这个错误,因为 gridfs 假设让您流式传输超过 16mb 的数据?

【问题讨论】:

  • PyMongo 驱动程序仅针对官方 MongoDB 服务器构建和测试。您的里程会因 CosmosDB 等仿真环境而异。我针对 MongoDB 运行了您的代码,它可以工作。它在 CosmosDB 上失败。我建议你向微软的人寻求帮助。,
  • 感谢您的回答。通过在第 198 行的文件 network.py 的 pymongo 库中添加“max_message_size=50777216”,该问题得到了部分解决。

标签: mongodb pymongo azure-cosmosdb gridfs gridfs-stream


【解决方案1】:

从https://stackoverflow.com/a/56673024/4355695 获得非干预解决方案:在pymongo's .find() 函数中使用batch_size 参数:

result = mdb['collection1'].find({}, batch_size=60)

我的收藏有 v.large 记录。使用 batch_size=1 似乎太低了; 100 导致了同样的错误。经过一些试验后,我将这个 60 数字确定为最佳值。获取数据的速度不受影响。随后,我对多个集合中的数千条此类记录运行相同的命令,但没有遇到任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-01
    • 2012-10-05
    • 2013-11-30
    • 2017-12-31
    • 1970-01-01
    • 2013-05-12
    • 2015-09-01
    • 1970-01-01
    相关资源
    最近更新 更多