在批量插入mongodb之前临时存储一百万个Java对象

时间:2013-10-23 06:47:00

标签: java mongodb

我有一个要求,我需要从文本文件解析JSON对象并将它们持久保存到MongoDB中。

一些细节 -

  1. 文件大小~1-10 MB,#json对象~100 k,单个json的大小 因此对象很小..
  2. Mongodb群集(分片和复制)
  3. 表演 - 时间非常宝贵..
  4. 我不能将任何对象转储到我的mongodb集合,除非我解析和 验证整个文件..
  5. 我的应用程序使用J2EE堆栈(Spring 3.2)
  6. 所以现在我需要存储一百万个Java对象,然后才能批量插入到mongodb ..(mongodb是分片的......所以我必须预先拆分以获得更好的性能等)

    我的问题是如何才能提高效率?我想到的一些方法 -

    1. 将对象序列化并存储到文件中。 (问题:IO时间)
    2. 在独立的非分片蒙戈上制作临时收藏品 批量插入所需的集合(看起来比#1好)。
    3. 任何人都可以分享她遇到类似问题的经历吗?如果需要任何其他信息,请告诉我。

3 个答案:

答案 0 :(得分:3)

建议的内存解决方案不是一个好的长期解决方案,因为一旦您遇到不适合内存的数据,您可能需要重新设计您的应用程序。

在RDBSM中,您应该利用交易的目的。只是使用流方法,我的意思是加载数据,验证并放入DB。如果你遇到无效的对象,只需回滚事务,一切正常。取决于是否有可能长时间锁定数据,因为RDBMS通常会锁定整个表,没有人能够读取它们。

现在,当NoSQL DB的一致性较低时,您可以解决问题。关键是你必须提供数据的编程回滚。

  1. 您可以使用其他数据库,例如Redis用于存储临时数据。由于Redis具有可选的持久性,因此只有在内存大小不适合的情况下,才能从大型主内存中受益并将数据存储到硬盘中。
  2. 或者您可以提供批量插入和标记数据(例如,通过布尔标志),它们尚未就绪。显然,对生产数据的查询必须避免使用 not ready flag
  3. 一旦你将使用临时表,它有很多约束,因为两个相同的并发操作会影响自己。
  4. 我将如何设计它?

    可能为这个 not ready data 使用mongo的一个实例以避免相互影响,一旦你知道它们可以转移到生产中,只需将它们移动到正确的表中即可。

答案 1 :(得分:1)

你提到的两种方式都很好。我建议你也这样想。

  1. 由于文件大小不大,您可以拥有一个可以容纳对象的数组。
  2. 验证对象后,将其推送到阵列。
  3. 在验证所有对象时,您可以将它们插入到mongoDB中。

答案 2 :(得分:0)

我会使用RAM和直接ByteBuffer的地图。在这种情况下,您不仅限于堆RAM。你可以用ByteBuffer给你InputStream包裹来处理 - Wrapping a ByteBuffer with an InputStream。这种方式可能很棘手,需要进行试验,即选择适当的缓冲区大小来从ByteBuffer读取。