MongoDB - 合并集合和映射 - 可以提高性能

时间:2015-10-25 16:15:52

标签: java oracle mongodb plsql merge

下面的函数合并单词MongoDB集合并映射内容如下:

收集: 猫3, 狗5

地图: 狗2, 斑马1

合并后的集合: 猫3, 狗7, 斑马1

我们有大约14000个元素的空集合和地图。

使用在15k RPM HD上运行的一个合并SQL的Oracle PL / SQL过程可以在不到一秒的时间内完成。

SSD磁盘上的MongoBD需要大约53秒。

看起来Oracle准备文件操作的内存映像 并将结果保存在一个i / o操作中。

MongoDB可能会执行14000次i / o - 每次插入大约需要4 ms。它与SSD的性能相对应。

如果我只进行14000次插入而不搜索文档存在,就像合并一样,一切工作也很快 - 少于一秒。

我的问题:

  1. 代码可以改进吗?

  2. 也许有必要对MongoDB配置做些什么?

  3. 功能代码:

    public void addBookInfo(String bookTitle, HashMap<String, Integer> bookInfo)
    {
        // insert information to the book collection
        Document d = new Document();
        d.append("book_title", bookTitle);
        book.insertOne(d);
        // insert information to the word collection
        // prepare collection of word info and book_word info documents
        List<Document> wordInfoToInsert = new ArrayList<Document>();
        List<Document> book_wordInfoToInsert = new ArrayList<Document>();
        for (String key : bookInfo.keySet())
        {
            Document d1 = new Document();
            Document d2 = new Document();
            d1.append("word", key);
            d1.append("count", bookInfo.get(key));
            wordInfoToInsert.add(d1);
            d2.append("book_title", bookTitle);
            d2.append("word", key);
            d2.append("count", bookInfo.get(key));
            book_wordInfoToInsert.add(d2);
        }
        // this is collection of insert/update DB operations
        List<WriteModel<Document>> updates = new ArrayList<WriteModel<Document>>();
        // iterator for collection of words
        ListIterator<Document> listIterator = wordInfoToInsert.listIterator();
        // generate list of insert/update operations
        while (listIterator.hasNext()) 
        {
            d = listIterator.next();
            String wordToUpdate = d.getString("word");
            int countToAdd = d.getInteger("count").intValue();
            updates.add(
                new UpdateOneModel<Document>(
                    new Document("word", wordToUpdate),
    
                    new Document("$inc",new Document("count", countToAdd)),
                    new UpdateOptions().upsert(true)
                )
            );
        }
        // perform bulk operation
        // this is slowly
        BulkWriteResult bulkWriteResult = word.bulkWrite(updates);
        boolean acknowledge = bulkWriteResult.wasAcknowledged();
        if (acknowledge)
            System.out.println("Write acknowledged.");
        else
            System.out.println("Write was not acknowledged.");
        boolean countInfo = bulkWriteResult.isModifiedCountAvailable();
        if (countInfo)
            System.out.println("Change counters avaiable.");
        else
            System.out.println("Change counters not avaiable.");
        int inserted = bulkWriteResult.getInsertedCount();
        int modified = bulkWriteResult.getModifiedCount();
        System.out.println("inserted: " + inserted);
        System.out.println("modified: " + modified);
        // insert information to the book_word collection
        // this is very fast
        book_word.insertMany(book_wordInfoToInsert);
    }   
    

0 个答案:

没有答案
相关问题