如何增加' db.collection.insert()'批量插入速度为100K MongoDB对象

时间:2015-12-16 10:15:43

标签: ruby-on-rails mongodb ubuntu mongo-shell batch-insert

在我的Ubuntu服务器上,我有一个依赖于MongoDB的Ruby on Rails应用程序。我经常使用Mongoid将对象注入到数据库中,但是当注入大量对象时,我编译了大量哈希并使用mongo Shell方法db.collection.insert()注入它:

ObjectName.collection.insert([{_id: BSON::ObjectId('5671329e4368725951010000'), name: "foo"}, {_id: BSON::ObjectId('567132c94368725951020000'), name: "bar"}])

批量插入时间对我来说是一个瓶颈。例如,批量插入150000个对象需要23秒。是否可以以更快地插入批量的方式分配资源?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用mongoid gem

batch = [{_id: BSON::ObjectId('5671329e4368725951010000'), name: "foo"}, {_id: BSON::ObjectId('567132c94368725951020000'), name: "bar"}]

Post.collection.insert(batch) #lest Post is the model

或者您可以通过Ruby MongoDb Driver

来完成
require 'mongo'
mongo_client = Mongo::MongoClient.new
coll = mongo_client['test_db']['test_collection']
bulk = coll.initialize_ordered_bulk_op
batch.each do |hash|
  bulk.insert(hash)
end
bulk.execute

如果你想以同样的方式通过mongo查询。您可以关注Bulk Insert

要增加数据,您可以使用sharding

  

Sharding是跨多个存储数据记录的过程   机器,是MongoDB满足数据需求的方法   生长。随着数据大小的增加,单个机器可能不会   足以存储数据,也不提供可接受的读写   吞吐量。分片解决了水平缩放的问题。同   分片,您添加更多的机器来支持数据增长和需求   读写操作。

不同的缩放

  

垂直扩展会增加更多的CPU和存储资源   容量。通过增加容量进行扩展具有局限性:高性能   具有大量CPU和大量RAM的系统   比小型系统更昂贵。另外,   基于云的提供商可能只允许用户配置较小的   实例。因此,具有实用的最大能力   垂直缩放。相比之下,分片或水平缩放   划分数据集并在多个服务器上分发数据,   或碎片。每个分片都是一个独立的数据库,统称为   分片组成一个逻辑数据库。