【发布时间】:2017-07-18 00:36:27
【问题描述】:
我使用 bsondump 将一个巨大的 (69GB) 文件导出到 json。我希望得到一个有效的 json 数组,但对象没有分开。
有一个使用 mongoexport 创建 json 数组的选项。但是这个 bson 文件是从另一台机器导出的,出于大小和性能方面的考虑,我不想先导入这个大文件,然后才能使用 mongoexport 从数据库中导出它。
如何使用 bsondump 导出有效的 json 数组?
编辑
为了提供更多背景信息,为什么我需要从基于 bson 的 mongodb 导出转换为 json:
1) 我试图使用 mongoexport 直接从 mongodb 导出 json。就像这样:
mongoexport -d mydb -c notifications --jsonArray -o lv.json
这样做的问题是没有可用于导出的进度,并且它的运行速度比 mongodump 慢得多(例如,在我不得不停止之前它从未完成)。我对生产服务器施加了很大的压力。正如我在最初的问题中所说,出于这个原因,这不是一个选择。
2) mongodump 的工作速度更快,可能是因为它不必转换为 json,只需转储内部数据。它也显示了进展,所以我知道它什么时候会完成。所以这是我唯一可以在生产服务器上运行的东西。
mongodump --db mydb
编辑 2
导出为 .bson 后,可以使用 bsondump 将 .bson 文件转换为 .json 文件:
bsondump mydata.bson > mydata.json
在这里明确一点:bsondump 没有像 mongoexport 这样的 --jsonArray 选项。因此它无法导出有效的 json 数组,而是将多个根对象转储到一个文件中。结果是一个无效的文档,必须对其进行预解析。
/Edit2
3) 我基本上有两个选择:将 bson 转储导入本地数据库,然后使用 mongoexport --jsonArray 将其导出到正确的 json 文件。或者找到解决 bsondump 本身无法导出到正确的 json 数组文件的方法。第三个选项,在我的工具中实现一个 bson 解析器,我并不是很喜欢......
大文件不是我的工具的问题。我的工具是用 C++ 编写的,专门用于大型数据流。我在后台使用 rapidjson 和 SAX 解析器,并通过自己的类似 SQL 的评估器过滤掉记录。由于我使用的是 SAX 解析器而不是 DOM,因此内存使用量通常在
【问题讨论】:
-
您可能会从数据库中删除
mongodump?因为bsondump的工作是将输出转换为 JSON。如果它来自mongoexport,那么它已经是 JSON 或 CSV,因为它们是唯一支持的东西。您的意思可能是--jsonArray和mongoexport,否则默认情况下是“换行符”。 -
更重要的是,如果这实际上是 69GB,那么创建一个以“数组”表示法包装的文件几乎毫无意义,因为您显然不想将全部内容实际加载到内存中(或者至少我希望不是)。所以你真正应该问的是如何设置你的“解析器”,它实际上需要读取这个 JSON 输出(甚至直接读取 BSON)来处理默认的“换行符”分隔。因为
--jsonArray实际上只是一个“hack”,用于处理懒惰的代码,而懒得设置这样的东西。也适用于“小”数据。 -
@NeilLunn 请查看我的问题的更新。
-
我看到你添加的内容,我认为它只是重新强化了我的观点。你不想要一个像“jsonArray”这样的输出。相反,您应该读取块并在边界上解析,而不是将所有内容都放入内存并在完整内容上运行解析。这是很容易的事情。但是你问了所有错误的问题,让自己很难受。我应该能够为您指出正确的方法来做到这一点。而是提出关于这些的问题。
-
您在寻求帮助时可能会考虑更有礼貌。