我的Meteor应用程序采用CSV文件,使用Baby Parse(服务器的Papa Parse)解析它并将数据插入MongoDB集合。
每个CSV行都作为文档插入。 24 MB CSV文件包含~90万行;因此,集合中约有900,000份文件。每个文档有5个字段,包括文档的唯一ID。
当我使用dataSize()
获取集合大小时,我会收到号码230172976;如果我没弄错的话,这个数字是以字节为单位的;因此它是230 MB。
为什么会发生这种巨大的增长?我该如何解决这个问题?
答案 0 :(得分:6)
这是因为.dataSize()
返回的值包括记录padding。另请注意,如果您的文档没有@echo off
SET "strPort=1972"
:LOOP
cls
netStat -n | find ":%strPort%"
ping -n 5 127.0.0.1 > nul
GOTO LOOP
字段,则会添加该字段,并且每个_id
字段为_id
。您可能需要阅读Record Allocation Strategies
我该如何解决这个问题:
使用带有noPadding标志的collMod命令或带有db.createCollection()
选项的noPadding方法。 但是你不应该这样做,因为正如documentation 中提到的那样:
仅将工作负载没有导致文档增长的更新操作的集合设置为noPadding,例如对于工作负载仅为插入的集合。
正如Pete Garafano在下面comment中提到的,这仅适用于MMAPv1 Storage Engine;这是MongoDB 3.0和所有先前版本中的默认存储引擎。
MongoDB 3.2使用WiredTiger Storage Engine,您需要更改默认存储引擎才能在configuration file中使用该选项或使用12-byte
选项。