我有一个存储大量数据的数组,我需要将这些数据插入MongoDB中。
我可以使用以下代码实现这一目标。但是需要1.5分钟。我需要在几秒钟内推动。还有其他方法可以将大量数组数据推入MongoDB吗?
HeadDet是一个数组,有300万个记录。
session, err := mgo.Dial(“localhost”)
if err != nil {
panic(err)
}
defer session.Close()
// Optional. Switch the session to a monotonic behavior.
session.SetMode(mgo.Monotonic, true)
c := session.DB("Test").C("Indicators")
for i := 0; i < len(HeadDet); i++ {
err = c.Insert(HeadDet[i])
}
if err != nil {
log.Fatal(err)
}
我已经推荐了this链接
答案 0 :(得分:3)
首先,放下labix.org/mgo
(又名gopkg.in/mgo.v2
),它已过时,不需要维护。而是使用社区支持的分支:github.com/globalsign/mgo
。
接下来,要批量执行插入或更新操作,请使用Bulk API introduced in MongoDB 2.6。 mgo
驱动程序支持使用mgo.Bulk
类型的批量操作。
您要插入“ 30万条记录”。对于不知道的人,"lakh"是印度编号系统中的一个单位,等于十万(100,000)。所以300万等于300万。
使用Bulk API,您可以通过这种方式高效地插入所有API:
c := session.DB("Test").C("Indicators")
// BULK, ORDERED
bulk := c.Bulk()
for i := 0; i < len(HeadDet); i++ {
bulk.Insert(HeadDet[i])
}
res, err := bulk.Run()
请注意,如果您不关心插入顺序,则可以将批量操作置于无序模式,这样可以加快操作速度:
// BULK, UNORDERED
bulk := c.Bulk()
bulk.Unordered()
for i := 0; i < len(HeadDet); i++ {
bulk.Insert(HeadDet[i])
}
res, err := bulk.Run()
为进行比较,在我的计算机上(客户端-服务器是同一台计算机,因此没有网络延迟),具有300万个单独插入的循环需要5分钟43秒。
有序的批量操作插入300万个文档需要 18.6秒!
插入300万个文档的无序批量操作需要 18.22秒!