2014-01-15 110 views
0

我现在正在使用Mongodb作为缓存。该应用程序将在晚上提供3个CSV,并且CSV会变得更大,因为新产品将一直添加。现在,我达到了500万条记录,处理所有事情花了大约2个小时。由于缓存每天都会刷新,刷新数据将变得不切实际。随着时间的推移,Mongodb性能会显着下降。

例如

CSV 1 
ID, NAME 
1, NAME! 

CSV 2 
ID, DESCRIPTION 
1, DESC 

CSV 3 
ID, SOMETHING_ELSE 
1, SOMETHING_ELSE 

的应用程序将读取CSV 1,并把它在数据库中。然后,CSV 2将被读取,如果有新的信息将被添加到相同的文档或创建一个新的记录。同样的逻辑适用于CSV 3.因此,一个文档将从不同的CSV获得不同的属性,因此upsert。一切完成后,所有的文件将是索引。

现在第一百万份文件相对较快,但我可以看到随着时间的推移,性能会大大降低。我猜这是因为Mongodb必须找到文档并更新属性,否则就创建它。我正在使用Java驱动程序和MongoDB 2.4。无论如何,我可以改进,甚至在mongodb java驱动程序中进行批量upsert?

回答

1

你说的“一切之后完成,那么所有的文件将被索引”是什么意思? 如果是因为你想添加额外的索引,最后这样做是值得商榷的,但是没关系。 如果你完全没有索引,那么这可能是你的问题。

你要确保所有的插入/ upserts你正在使用的是指数做。您可以运行一个命令并使用.explain()来查看是否正确使用索引。 您需要一个索引,否则您将为每个插入/更新扫描一百万个文档。

而且,你能也给你的应用程序更多的细节?

  1. 你打算在3个阶段只进行一次导入,还是你会频繁更新?
  2. CSV2和CSV3是否修改大部分文档?
  3. 做的CSV2和CSV3添加或替换文件的修改?
  4. 文档的平均大小是多少?

让我们假设你在相同的文档上进行了很多次更新。例如,CSV2和CSV3在相同的文档上有更新。除了导入CSV1之外,您还可以为CSV2进行更新,然后再进行CSV3更新,您可能只需将文档保存在应用程序的内存中,将所有更新应用到内存中,然后将文档推送到数据库中。这假定你有足够的内存来完成操作,否则你将再次使用磁盘。

相关问题