如何在Colab中将超大规模IOB数据集转换为spaCy的JSON/二进制格式
解决方案
报错根因
tcmalloc: large alloc 报错本质是Colab默认运行时的内存不足以一次性加载6500万条IOB条目完成全量转换,属于大文件处理场景下的常见内存溢出问题。
拆分转换再合并方案(最高可行性)
你提到的拆分后单独转换再合并的方案完全可用,具体操作步骤如下:
- 拆分原始IOB文件
- 拆分时需注意IOB格式的单个样本间以空行分隔,不能直接按行数硬切破坏样本结构,推荐用awk命令按固定样本数拆分,示例为每20万条样本拆分一个子文件:
awk 'BEGIN {n=0; file="/content/train_part_00.tsv"} /^$/ {if(++n%200000==0) {close(file); file=sprintf("/content/train_part_%02d.tsv", n/200000)}} {print >> file}' /content/train.tsv - 也可以用shell自带的split命令按行数拆分,适合对IOB格式校验确认后的场景,示例为每100万行拆分为一个子文件:
split -l 1000000 -d --additional-suffix=.tsv /content/train.tsv /content/train_part_
- 批量转换拆分后的子文件
- 执行简单的python循环脚本挨个转换所有子文件:
import os for file_name in os.listdir("/content/"): if file_name.startswith("train_part_") and file_name.endswith(".tsv"): os.system(f"python -m spacy convert /content/{file_name} /content/ -s -c ner")
- 转换完成后会生成多个对应子文件的
.spacy格式二进制文件。
- 合并spaCy二进制文件
- 直接调用spaCy自带的
assemble命令完成合并,该命令为增量读取,不会占用过高内存:!python -m spacy assemble /content/train_part_*.spacy /content/train_full.spacy
其他无需拆分的替代方案
- 调整内存参数后全量转换:在转换命令前增加tcmalloc缓存限制、调低并行进程数减少内存占用,示例命令如下:
!TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES=268435456 python -m spacy convert /content/train.tsv /content/ -s -c ner -n 4 - 切换Colab高内存运行时:点击顶部菜单栏「修改」-「笔记本设置」-「运行时规格」,选择高内存选项,免费用户也有概率分配到12G以上内存的运行时,可直接支撑全量转换。
内容的提问来源于stack exchange,提问作者parth jangid
相关产品推荐
相关产品推荐

