使用mongoimport导入大CSV文件时遇VirtualAlloc内存分配错误
看起来你在Windows环境下用mongoimport导入大型CSV文件时碰到了内存分配的典型问题——那个VirtualAlloc of 5131534336 bytes failed with errno=1455错误,本质是系统无法满足程序的内存请求,errno=1455对应Windows的“页面文件太小,无法完成操作”,通常是因为内存占用超出了系统能分配的范围,尤其是在导入最后阶段的内存合并环节。
下面是几个针对性的解决方案,按优先级排序:
1. 减少插入工作线程数
你当前设置了--numInsertionWorkers 9,过多的工作线程会让mongoimport在处理和缓存数据时占用大量内存。建议降低这个数值,比如调整到4甚至2,具体根据你的物理内存大小来定。修改后的命令示例:
mongoimport -d dbname -c collectionName --type csv --file filename -f "a,b" --numInsertionWorkers 4
2. 扩大Windows虚拟内存(页面文件)
Windows默认的页面文件大小可能不足以支撑这么大的内存请求,手动调整一下:
- 右键「此电脑」→ 属性 → 高级系统设置 → 高级标签 → 性能区域点击「设置」→ 高级标签 → 虚拟内存区域点击「更改」
- 取消「自动管理所有驱动器的分页文件大小」,选中系统盘(一般是C盘),选择「自定义大小」
- 建议把最大值设置为物理内存的1.5-2倍(比如物理内存8GB的话,最大值设为16GB),设置完成后点击「确定」并重启系统
3. 分批导入CSV文件
如果你的CSV文件特别大,直接导入容易爆内存,可以把它拆分成多个小文件(比如每个1GB左右),然后逐个执行导入命令。这样每个批次的内存占用会大幅降低,避免一次性加载过多数据到内存。
4. 调整批处理大小
mongoimport默认的批处理大小可能偏大,你可以手动指定更小的--batchSize,减少单次插入的内存消耗,比如设置为1000或者5000:
mongoimport -d dbname -c collectionName --type csv --file filename -f "a,b" --numInsertionWorkers 4 --batchSize 1000
额外提一句:这类内存分配问题在Windows平台比较常见,因为Windows的内存管理机制和Linux不同,大内存分配更容易受限。如果以上方法都不太见效,也可以考虑在Linux环境下执行导入操作,Linux的内存管理对这类大内存操作会更友好。
内容的提问来源于stack exchange,提问作者Zohaib Aslam

