0

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

一些细节 -

  1. 文件大小 ~ 1-10 MB,#json 对象 ~ 100 k,因此单个 json 对象的大小非常小..
  2. Mongodb 集群(分片和复制)
  3. 性能 - 时间非常宝贵。
  4. 除非我解析并验证整个文件,否则我无法将任何对象转储到我的 mongodb 集合中。
  5. 我的应用程序使用 J2EE 堆栈(Spring 3.2)

所以现在我有一百万个 Java 对象,在批量插入到 mongodb 之前我需要存储这些对象..(mongodb 是分片的..所以我必须预先拆分以获得更好的性能等)

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

  1. 序列化对象并将其存储到文件中。(问题:IO时间)
  2. 在独立的非分片 mongo 上创建一个临时集合,然后批量插入所需的集合(看起来比 #1 更好)。

任何人都可以分享她对类似问题的经验..?如果需要任何其他信息,请告诉我..

4

3 回答 3

3

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

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

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

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

我将如何设计它?

可能对这些未准备好的数据使用一个 mongo 实例以避免相互影响,一旦您知道它们可以转移到生产环境中,只需将它们移动到正确的表中即可。

于 2013-10-23T07:22:39.147 回答
1

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

  1. 由于文件大小不是很大,您可以拥有一个保存对象的数组。
  2. 验证对象后,将其推送到数组中。
  3. 在验证所有对象时,您可以将它们插入到 mongoDB。
于 2013-10-23T06:51:39.387 回答
0

我会使用 RAM 和直接ByteBuffers 的 Map。在这种情况下,您不仅限于堆 RAM。你可以ByteBuffer用一个InputStream来包装你 -用一个 InputStream 包装一个 ByteBuffer。这种方式可能很棘手并且需要试验,即选择一个合适的缓冲区大小来从ByteBuffer.

于 2013-10-23T08:12:54.943 回答