在MongoDB中批量插入GridFS

1 投票
3 回答
1957 浏览
提问于 2025-04-28 03:52

这可能吗?如果可以的话,怎么做呢?

现在我正在把超过16MB的字符串一个一个地插入到GridFS里,但当我需要处理成千上万的字符串时,这个速度非常慢。我试着查了一下文档,但没有找到关于如何批量插入到GridFS存储的任何信息,而不仅仅是简单的集合。

我正在使用PyMongo来和MongoDB进行通信。

暂无标签

3 个回答

0

这个16MB的文档大小限制也是在往数据库批量插入数据时的限制(可以查看请求大小限制的相关内容)。批量插入文档的方法通常就是把数据分成几块(实际上就是一大堆文档的数组),然后一起发送到数据库。你可以手动尝试一下,创建一个很大的文档数组,然后在命令行中自己插入,但上限还是会存在。

使用GridFS时,用来分割存储文件的块大小是255/256k(默认是255k,因为这个2.4.10的更新和相关的驱动程序更新),所以理论上你可以在一次发送给服务器的消息中放大约64个块,但如果出现故障,如何恢复可能会比较棘手。你也可以配置这个块的大小,这可能是个更好的选择,具体可以参考pymongo的文档关于chunkSize的部分,但同样,你需要保持在16MB的限制之内。

1

如果你把它们放在文件里,像这样:

for $LETTER in {a..z}
do
  ( find /path/to/basedir -iname "$LETTER*" -exec mongofiles -d yourGrid '{}' \; &)
done

这应该会让你有26个线程把数据推送到MonoDB里。

完成后,根据你的需要重命名你的yourGrid.fs集合。

为了确保不会出错,你应该在screen工具里运行这个命令,或者把它从你的终端中分离出来。

1

我看了很多回答,但遗憾的是都没能满足我的需求。我需要用来指定GridFS中JSON的_id的数据,实际上是存储在JSON内部的。这听起来像是个糟糕的主意,因为这样会有重复数据等等,但这就是需求。于是我写了一个插入线程,用于多线程插入到GridFS,并用几个线程(2个GridFS线程就足够了,能达到不错的性能)插入了所有数据。

撰写回答