对pandas dataframe列应用.split()分词时出现RAM崩溃问题如何解决
问题原因
你遇到的内存崩溃问题核心来自两点:
- 自定义函数+apply的逐行迭代写法会产生大量多余的中间内存拷贝,运行效率低、内存开销大
- 将整列字符串全部转换为列表类型存储时,pandas存储object类列表的内存开销远高于原始字符串,数据量大时会直接占满Colab的可用RAM
解决方法
方法1:使用pandas内置矢量化操作替代apply
pandas内置的str.split()是C实现的矢量化操作,比自定义apply函数的内存占用低数倍,运行速度也快很多,直接替换原有代码即可:
# 先填充空值避免报错 df_Train["BULLET_POINTS"] = df_Train["BULLET_POINTS"].fillna("") # 直接调用矢量化分词,无需自定义函数和apply df_Train["BULLET_POINTS"] = df_Train["BULLET_POINTS"].str.split() df_Train.head()
方法2:分块处理全量数据集
如果数据集本身很大,一次性加载全量到内存已经接近RAM上限,直接在读入阶段分块处理,处理完成后再合并或者分步存储:
import pandas as pd # 可根据Colab可用内存调整单块行数,一般1-5万行都可以 chunk_size = 20000 processed_chunks = [] for chunk in pd.read_csv("你的训练数据路径.csv", chunksize=chunk_size): chunk["BULLET_POINTS"] = chunk["BULLET_POINTS"].fillna("").str.split() processed_chunks.append(chunk) # 合并所有处理好的分块,也可以每块单独存为临时文件进一步降低内存占用 df_Train = pd.concat(processed_chunks, ignore_index=True)
方法3:不将分词结果存回DataFrame
如果后续只需要迭代使用分词结果(比如训练词向量、统计词频),可以直接生成迭代器,不把全量分词结果存入DataFrame,内存开销降到最低:
def get_token_iter(df): for text in df["BULLET_POINTS"].fillna(""): yield text.split() # 后续处理直接使用该迭代器即可,无需存储全部分词结果 token_iter = get_token_iter(df_Train)
额外优化建议
- 处理过程中及时删除不需要的变量和列,主动调用
gc.collect()释放内存 - 可尝试切换Colab的高内存运行时,获得更大的RAM配额
内容的提问来源于stack exchange,提问作者anfjnlnl
相关产品推荐
相关产品推荐

