当我尝试通过GridFS(300mb)获取存储在MongoDB中的文件时,我收到错误:
2014-07-16T22:50:10.201+0200 [conn1139] assertion 17144 Runner error:
Overflow sort stage buffered data usage of 33563462 bytes exceeds internal limit of 33554432 bytes ns:myproject.export_data.chunks query:{ $query: { files_id: ObjectId('53c6e5485f00005f00c6bae6'), n: { $gte: 0, $lte: 1220 } }, $orderby: { n: 1 } }
我找到了类似的东西,但它已经修复了: https://jira.mongodb.org/browse/SERVER-13611
我正在使用MongoDB 2.6.3
答案 0 :(得分:3)
不确定您使用的是哪个驱动程序或驱动程序版本,但很明显您的实现是发出“排序”而没有索引,当您在一个范围内拉入块时,您正在炸毁32MB内存排序限制。
更好的驱动程序实现不会执行此操作,而是使用单个查询“循环”块。但问题是你的集合缺少它需要的索引,无论是你自己的设置还是创建这个集合的驱动程序实现。
您似乎已将“root”空间命名为“export_data”,因此切换到包含GridFS集合的数据库存在以下问题:
db.export_data.chunks.ensureIndex( { files_id: 1, n: 1 }, { unique: true } )
或者在应用程序代码中添加一些内容以确保索引存在。
答案 1 :(得分:1)
这不是错误。它显然是关于错误消息中描述的sort
,而不是关于GridFS。阅读本节关于sort limitation:
如果排序操作使用少于32兆字节的内存,MongoDB将仅在没有索引的字段上返回排序结果。 这意味着如果它使用超过32MB且没有索引的内存,则排序会中止。
如果你能发布你正在执行的陈述会更好。