使用快速递增更新在mongodb上存储哈希表

时间:2015-06-21 12:53:22

标签: mongodb scala casbah

我想在mongodb上存储单词直方图,与在内存中保存哈希表的方式非常类似。 我的输入数据来自普通的关系数据库或.csv文件。

shape  | color | size
*************************
circle | blue  | 5 
square | red   | 3
circle | red   | 10

我正在为每批数据生成一个直方图作为散列图的散列图:

{shape: {circle: 2, square: 1},
 color: {blue: 1, red: 2},
 size: {5: 1, 3: 1, 10: 1}}

我想将直方图保存在mongodb中,一旦新的数据到达,将其与当前的直方图合并。

将Scala与Casbah一起使用,我试图将每列的直方图存储为文档,并将每个值(圆形,方形等)存储为文档中的键。

{
    _id: "shape",
    circle: 2,
    square: 3
}

对于相同的数据,插入需要5秒钟,更新(upserts)需要> 300秒。

我还尝试将每列的直方图存储为集合,并将每个值存储为文档。 最初我为每个列生成一个集合并为_id创建一个散列索引,我使用$inc更新命令来增加计数器,我还将所有upsert查询与批量操作结合起来。

文件:

{
    _id: "circle",
    count: 2
}

生成集合的代码:

val db = mongoClient("test")
val column_names = List("shape", "color", "size")
column_names.foreach(column => 
     db(column).createIndex(MongoDBObject("_id" -> "hashed"))

用于插入数据的代码:

def upsertMongo(h: mutable.HashMap[String, mutable.HashMap[String, Long]]) = {
    val mongoClient = MongoClient("localhost", 27017)
    val db = mongoClient("test")
    h.foreach{case(column_name, histogram) =>
        val mongo_collection = db(column_name)
        val builder = mongo_collection.initializeUnorderedBulkOperation
        histogram.foreach{case(word, count) =>
            val query = MongoDBObject("_id" -> word)
            val update = $inc("count" -> count)
            builder.find(query).upsert().updateOne(update)
        }
        builder.execute()
    }
}

它以这种方式运行得更快,但仍然不够快,~30秒插入与5秒插入。 如何使插件像插页一样快速地工作?它甚至可能吗? (总体数据足够小,可以完全缓存)

0 个答案:

没有答案