2013-07-11 72 views
0

所以情況如此:我有一個程序需要兩個大的csv文件,找到差異,然後發送一個數組列表到一個方法,該方法應該用數組中的行更新mongodb。問題是更新正在持續進行。一個包含5000個更新的測試用例需要36分鐘。這是正常的嗎?用java驅動更新mongodb需要永久嗎?

update(List<String> changes) - 方法是這樣的:

mongoClient = new MongoClient(ip); 
db = mongoClient.getDB("foo"); 
collection = db.getCollection("bar"); 

//for each line of change 
for (String s : changes) { 
    //splits the csv-lines on ; 
    String[] fields = s.split(";"); 

    //identifies wich document in the database to be updated 
    long id = Long.parseLong(fields[0]); 
    BasicDBObject sq = new BasicDBObject().append("organizationNumber",id); 

    //creates a new unit-object, that is converted to JSON and then inserted into the database. 
    Unit u = new Unit(fields); 
    Gson gson = new Gson(); 
    String jsonObj = gson.toJson(u); 
    DBObject objectToUpdate = collection.findOne(sq); 
    DBObject newObject = (DBObject) JSON.parse(jsonObj); 

    if(objectToUpdate != null){ 
     objectToUpdate.putAll(newObject); 
     collection.save(objectToUpdate); 
} 
+0

您是否檢查過服務器上的統計信息?看起來應該不會花費那麼長時間纔能有合理的配置。 – WiredPrairie

+0

@WiredPrairie我剛剛安裝了它,我在找什麼?你看,這是我第一次使用mongo。 – user2507863

+0

是否將'organizationNumber'編入索引? – WiredPrairie

回答

1

那是因爲你正在採取額外的步驟來更新。 您不需要手動解析JSON,而只需單步執行「where」子句的更新,就無需執行查詢 - 然後更新。

事情是這樣的:

BasicDBObject query= new BasicDBObject().append("organizationNumber",id); 
Unit unit = new Unit(fields); 
BasicDBObject unitDB= new BasicDBObject().append("someField",unit.getSomeField()).append("otherField",unit.getOtherField()); 
collection.update(query,unitDB); 

query指定 「where」 子句和unitDB指定需要更新的領域。

+0

儘管這樣可以改進算法,但由於某些其他原因,它似乎仍然非常慢。 5000在36分鐘內找到並更新...這在合理的硬件上並不多。 – WiredPrairie

+0

你有太多索引嗎?索引使插入速度明顯變慢。嘗試刪除索引,如果你有他們,看看是否有任何區別。 – AntonioOtero