Python MongoDB中GridFS的大容量插入

Python MongoDB中GridFS的大容量插入,python,mongodb,pymongo,bulkinsert,gridfs,Python,Mongodb,Pymongo,Bulkinsert,Gridfs,可能吗?如果是的话,那怎么办 目前,我正在一个接一个地将大于16MB的字符串插入GridFS,但在处理数千个字符串而不是一个字符串时,速度非常慢。我试图查看文档,但没有找到一行关于大容量插入GridFS存储的内容,而不仅仅是简单的集合 我使用PyMongo与MongoDB进行通信。16MB文档大小限制也是对数据库进行批量插入的限制(请参见驱动程序规范)。文档的大容量插入方法通常只是将内容成批分成块(基本上是巨大的文档数组)并将它们发送到数据库。您可以通过在shell中创建大量文档和您自己来手动尝

可能吗?如果是的话,那怎么办

目前,我正在一个接一个地将大于16MB的字符串插入GridFS,但在处理数千个字符串而不是一个字符串时,速度非常慢。我试图查看文档,但没有找到一行关于大容量插入GridFS存储的内容,而不仅仅是简单的集合


我使用PyMongo与MongoDB进行通信。

16MB文档大小限制也是对数据库进行批量插入的限制(请参见驱动程序规范)。文档的大容量插入方法通常只是将内容成批分成块(基本上是巨大的文档数组)并将它们发送到数据库。您可以通过在shell中创建大量文档和您自己来手动尝试,但上限仍然存在


使用GridFS时,用于分割存储的文件的块大小为255/256k(自和相关驱动程序更改以来,默认为255k),因此理论上,您可以在一条消息中向服务器分配~64个块,但确定如何从故障中恢复可能很棘手。您还可以配置块大小,这可能是一个更好的选择,请参阅on chunkSize,但同样需要保持在16MB的限制之下。

如果您将它们作为文件,例如

for $LETTER in {a..z}
do
  ( find /path/to/basedir -iname "$LETTER*" -exec mongofiles -d yourGrid '{}' \; &)
done
应该为您提供26个线程,将数据推入MonoDB

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


为了确保没有任何问题,您应该在screen实用程序中运行此命令,或者将其与终端分离。

我阅读并研究了所有答案,但不幸的是,它们没有满足我的要求。我在GridFS中指定JSON的_id时需要使用的数据实际上存储在JSON本身中。这听起来像是有史以来最糟糕的想法,包括冗余等,但不幸的是它的要求。
我所做的是,我编写了用于多处理插入的插入线程到GridFS,并用几个线程插入了所有数据(2个GridFS线程足以获得适当的性能)。

我建议不要使用GridFS存储,但您尝试了什么?为什么需要gridfs?每个文档16MB的限制不允许我使用基本集合。拆分文件是一件更复杂的事情,因为我希望它能够快速工作,而不需要额外的连接工作(基本上应该使用mongodb来摆脱这个任务+速度)。我不明白为什么不把文件放在静态存储中。这些字符串的内容是什么?为什么它们需要在数据库中而不是在静态存储中?它需要在内存中快速访问(这就是为什么MongoDB)。我想你可以一次线程化并插入多个记录。谢谢,我不知道批量插入限制。但是,如果有一个分块的过程,我还是很好的。问题是批量插入1000次或单行插入1000次。我可以批量插入集合,但为什么不能批量插入GridFS呢。即使它将在进程之前/之后被分块,我仍然希望使用批量插入(多插入)的速度优势,而不是发送大量的单插入。默认情况下是这样的-集合包括4个属性,其中一个是json文件,很容易超过16MB。因此,将json存储在gridFS中,并将其键插入到集合中。因此,如果我想插入1000行,我必须在gridFS中插入1000个json,然后在集合中插入1000行。当行数增长到10000行甚至100000行时,单行插入速度会很慢,因此在单个批量查询中插入是最好的选择,但对于gridFS,我根本看不到这样的选择,尽管它以某种方式呈现在集合中,甚至不提分块。问题是如何进行“多插入”以避免资源和时间浪费。顺便说一句,你的驱动程序规范链接不起作用(私有repo?)。不幸的是,我把它们都放在一个文件中。每一行都是一个JSON。简单的任务:
LINES=`wc-l yourbig.JSON`split-l$($LINES/26))yourbig.JSON
并更改原始脚本:
-iname“x$LETTER*”
似乎这样我就无法为GridFS文件指定自己的_id了。但是,我猜,多重处理是唯一的方法。我希望有办法在集合中插入>16MB的json,后端自己做了所有的分块工作+提供了完整的json选择api。好吧,如果您需要和自己的id,请考虑它是否可以转到元数据;)