- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个 1.3 亿行的 MongoDB 3.6.2.0 集合。它有几个简单的字段和 2 个带有嵌套 JSON 文档的字段。数据以压缩格式 (zlib) 存储。
我需要尽快将其中一个嵌入字段导出为 JSON 格式。但是,mongoexport 将永远存在。运行 12 小时后,它只处理了 5.5% 的数据,这对我来说太慢了。
CPU 不忙。 Mongoexport 似乎是单线程的。
我正在使用的导出命令:
mongoexport -c places --fields API \
--uri mongodb://user:pass@hostIP:hostPort/maps?authSource=admin \
-o D:\APIRecords.json
实际上是 getMore 命令,它在后台运行的速度非常慢:
2018-05-02T17:59:35.605-0700 I COMMAND [conn289] command maps.places command: getMore { getMore: 14338659261, collection: "places", $db: "maps" } originatingCommand: { find: "places", filter: {}, sort: {}, projection: { _id: 1, API: 1 }, skip: 0, snapshot: true, $readPreference: { mode: "secondaryPreferred" }, $db: "maps" } planSummary: COLLSCAN cursorid:14338659261 keysExamined:0 docsExamined:5369 numYields:1337 nreturned:5369 reslen:16773797 locks:{ Global: { acquireCount: { r: 2676 } }, Database: { acquireCount: { r: 1338 } }, Collection: { acquireCount: { r: 1338 } } } protocol:op_query 22796ms
我尝试在像这样的单独进程中使用 --SKIP
和 --LIMIT
选项运行多个命令
mongoexport -c places --SKIP 10000000 --LIMIT 10000000 --fields API \
--uri mongodb://user:pass@hostIP:hostPort/maps?authSource=admin \
-o D:\APIRecords.json
mongoexport -c places --SKIP 20000000 --LIMIT 10000000 --fields API \
--uri mongodb://user:pass@hostIP:hostPort/maps?authSource=admin \
-o D:\APIRecords.json
等等。但是我无法完成等到第一个非零 SKIP 的命令甚至开始!
我也试过 --forceTableScan
选项,没有任何区别。
我在 places 表上没有索引。
我的存储配置:
journal.enabled: false
wiredTiger.collectionConfig.blockCompressor: zlib
收藏统计:
'ns': 'maps.places',
'size': 2360965435671,
'count': 130084054,
'avgObjSize': 18149,
'storageSize': 585095348224.0
我的服务器规范:
Windows Server 2012 R2 x64
10Gb RAM 4TB HDD 6 cores Xeon 2.2Ghz
我进行了一项测试,SSD 的读取吞吐量与 HDD 相同。
我的问题:
为什么阅读这么慢?有没有其他人遇到过同样的问题?您能给我一些关于如何加快数据转储速度的提示吗?
我将数据库移至快速 NVME SSD 驱动器,我想现在我可以更清楚地表达我对 MongoDB 读取性能的担忧。
为什么这个命令,它试图找到一 block 没有特定字段的文档:
2018-05-05T07:20:46.215+0000 I COMMAND [conn704] command maps.places command: find { find: "places", filter: { HTML: { $exists: false }, API.url: { $exists: true } }, skip: 9990, limit: 1600, lsid: { id: UUID("ddb8b02c-6481-45b9-9f84-cbafa586dbbf") }, $readPreference: { mode: "secondaryPreferred" }, $db: "maps" } planSummary: COLLSCAN cursorid:15881327065 keysExamined:0 docsExamined:482851 numYields:10857 nreturned:101 reslen:322532 locks:{ Global: { acquireCount: { r: 21716 } }, Database: { acquireCount: { r: 10858 } }, Collection: { acquireCount: { r: 10858 } } } protocol:op_query 177040ms
仅在快速闪存驱动器上产生 50Mb/秒的读取压力?这显然是单线程随机(分散)读取的性能。而我刚刚证明该驱动器可以轻松实现 1Gb/秒的读/写吞吐量。
就 Mongo 内部而言,按顺序读取 BSON 文件并获得 20 倍的扫描速度提升不是更明智吗? (而且,由于我的 block 是 zlib 压缩的,并且服务器有 16 个内核,最好在一个或多个辅助线程中解码获取的 block ?)而不是一个又一个文档地迭代 BSON 文档。
我也可以确认,即使我没有指定任何查询过滤器,并且显然想要迭代整个集合,BSON 文件的快速顺序读取也没有发生。
最佳答案
限制导出性能的因素有很多。
secondaryPreferred
,这意味着它将尝试从辅助节点读取。如果副本集正在被主动写入,则辅助节点上的 oplog 应用操作将阻塞读取器。这将进一步增加延迟。一个可能的改进是,如果这是您经常执行的操作,请在相关字段上创建索引并使用 covered query 导出它。可以提高性能,因为索引会小于完整文档。
编辑:在这种情况下并行运行 mongoexport
可能会有所帮助:
根据提供的其他信息,我进行了一项测试,似乎在一定程度上缓解了这个问题。
似乎并行运行 mongoexport
,其中每个处理集合子集的 mongoexport
可能能够加快导出速度。
为此,请根据您计划运行的 mongoexport
进程的数量划分 _id
命名空间。
例如,如果我有 200,000 个文档,从 _id:0
到 _id:199,999
并使用 2 个 mongoexport
进程:
mongoexport -q '{"_id":{"$gte":0, "$lt":100000}}' -d test -c test > out1.json &
mongoexport -q '{"_id":{"$gte":100000, "$lt":200000}}' -d test -c test > out2.json &
在上面的例子中,两个 mongoexport
进程各自处理一半的集合。
使用 1 个流程、2 个流程、4 个流程和 8 个流程测试此工作流程我到达以下时间:
使用 1 个进程:
real 0m32.720s
user 0m33.900s
sys 0m0.540s
2 个进程:
real 0m16.528s
user 0m17.068s
sys 0m0.300s
4 个进程:
real 0m8.441s
user 0m8.644s
sys 0m0.140s
8 个进程:
real 0m5.069s
user 0m4.520s
sys 0m0.364s
根据可用资源,并行运行 8 个 mongoexport
进程似乎可以将进程加速约 6 倍。这是在一台 8 核的机器上测试的。
注意:halfer 的回答在思想上是相似的,虽然这个回答基本上是想看看并行调用 mongoexport
是否有任何好处。
关于mongodb - 是否可以提高 Mongoexport 的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50145668/
在 MongoDb.exe 上,我可以使用投影进行查询,其中只有一个字段,如下所示: db.cache_sta.find({ip:"10.5.8.17"},{_id:0, hostname:1}) {
我真的被这个弄糊涂了。下面是我的数据库和收藏。我无法让 mongoexport 将集合 itunes_itunes_level4_US_uniq 转储到 json 中。 我正在尝试通过: mongoe
当我尝试从 mongoDB 中获取数据时。我能够使用此查询显示我想要实现的目标 db.sInsert.distinct( "comments_data.comments.data.messag
mongoexport --db ucc_prod /host:myserver /port:27017 --username user1 --password password1 /query:'{
我用的是mongodb数据库,我在macOS上,命令mongoexport不通过,我在/bin目录下数据库 这是我的命令 mongoexport --db Battleship --collectio
我使用的是 MongoDB 版本 2.6.x。我需要从特定集合中导出文档。 mongoexport 是满足需求的工具。但是,我不知道如何导出嵌套数组下的所有对象。以下是我的示例文档。 { "_id
我正在尝试使用以下 mongoexport 命令从 mongo 数据库导出以搜索文本表情符号: mongoexport -d -c -f text -q '{text: /.*:\)/}' 但是当
我需要从我的 MongoDB(托管在 MongoHQ//Compose.io)实例中导出一些信息。我正在关注 these说明,其中提供了我需要的所有示例,并且似乎与官方 mongo 文档相对应。这是我
我正在尝试导出这样的集合: C:\Program Files\ConEmu>mongoexport --db test --collection person --out personTest.jso
我在 MongoDB 中有以下表单的集合。如您所见,有些文档有两个成员“id”和“xid”,有些只有1个“id”(除了对象_id) [ { "id" : 1, },
我正在尝试对 CSV 进行 mongoexport,但只选择带有查询的某些记录。这是我的命令(Windows 7 cmd): mongoexport --host foo.com --port 270
我一直在尝试使用 mongoexport 来获取集合的 csv 文件。我以前这样做过,但我不知道为什么现在我收到以下错误。 Error I'm getting 看起来它能够登录到数据库,但它不会超过
我试图将数据从 Mongo 导出到 Oracle。我曾经采用以下方法。 Step 1 : Export the data to CS file usign mongoExport command. S
尝试使用 mongoexport 导出 oplog 的 csv...尝试了我目前已阅读的所有引号组合... ../mongodb/bin/mongoexport --csv -d local -c o
我正在尝试按照本教程进行操作:http://www.ultrabug.fr/tag/mongoexport/ 并为查询行使用一个 sh 文件。这是我的文件: #!/bin/bash d=`date -
当我在我的 mongoshell 中输入 mongoexport 时,它显示以下错误, mongoexport Fri Nov 22 10:07:18.614 ReferenceError: mong
我正在尝试将一些来自 Mongo 的数据格式化为 CSV。其中一个字段存储为 ISODate,因此在查询 Mongo 时,结果如下: ... ISODate("2011-11-19T00:23:38.
尝试使用带有 mongoexport 的查询会导致错误。但是相同的查询被 mongo-client 评估而没有错误。 在 mongo-client 中: db.listing.find({"creat
如果要导出任何 mongodb 数据库的任何集合,可以使用 mongoexport 命令。例如: mongoexport --db dbname --collection collectionName
我有一个 1.3 亿行的 MongoDB 3.6.2.0 集合。它有几个简单的字段和 2 个带有嵌套 JSON 文档的字段。数据以压缩格式 (zlib) 存储。 我需要尽快将其中一个嵌入字段导出为 J
我是一名优秀的程序员,十分优秀!