YashanDB|用 yasldr 批量导入时报内存不足? 一文搞懂 bulkload 内存分配逻辑
【问题背景】
某现场在通过 yasldr 工具将 NewCIS 报表数据(约 300GB)导入 YashanDB 分布式环境时,遇到频繁报错:
复制代码
导入任务中断,影响测试与业务数据入库。
【环境信息】
YashanDB 版本:23.2.4.100 Enterprise Edition
部署拓扑:1mm + 1cn + 3dn
硬件配置:125GB 内存 / 32 核 CPU / 2TB HDD
导入方式:yasldr,单进程、32 线程、bulkload 模式
【问题分析】
bulkload 模式下的内存分配逻辑
每个导入线程能使用的内存大小受以下公式控制:
复制代码
COLUMNAR_VM_BUFFER_SIZE = 19375MB(配置)
COLUMNAR_MATERIAL_PERCENT = 80%(默认)
BULKLOAD_MAX_MEM_PERCENT = 80%(默认)
即:
复制代码
在设置 8 个 yasldr 实例、每实例 32 个线程时,总线程数达:
复制代码
平均每个线程的内存仅为:
复制代码
这远远无法满足高数据密度(如每行 20KB)的批量写入。
【规避建议】
方法一:降低线程数量
减小 yasldr 启动时的线程数,如控制在 8~16 以内,可显著提升单线程可分配内存。
方法二:调大内存参数(推荐)
可在导入前调整以下参数:

根据资源情况灵活设置,建议每线程内存不得低于 300MB,否则容易因数据行较大而失败。
【实时监控建议】
YashanDB 提供视图 dV$bulkloadStat 可用于观察当前导入线程状态、资源占用、异常计数等,便于动态排查。
复制代码
【总结】

评论