运行pandas join时Jupyter内核崩溃,求原因及解决方法
内核崩溃原因及解决办法
核心原因:内存资源耗尽
你的计算需求远超当前环境的内存上限:
- 连接后的结果表规模约为 1586万行 × 396列,按单元素8字节估算,内存需求接近50GB,而Colab默认内存仅12-16GB左右,内存过载直接导致内核崩溃。
- 用
TRAIN.head()测试时仅处理少量行,内存占用极低,因此能正常运行。
解决办法
1. 关闭排序以减少内存开销
去掉sort=True参数,排序操作会额外占用大量内存和计算资源,若后续不需要有序结果可直接省略:
X_student = TRAIN.join(STUDENT, on='UserId', how='inner')
2. 只保留必要列
STUDENT有390列,先筛选出后续分析真正需要的列,大幅压缩结果表规模:
# 示例:仅保留STUDENT中需要的列 selected_cols = ['col1', 'col2', 'col3'] STUDENT_filtered = STUDENT[selected_cols] X_student = TRAIN.join(STUDENT_filtered, on='UserId', how='inner')
3. 优化数据类型压缩内存
对两表的数据类型进行轻量化处理:
- 数值列:将
float64转为float32,int64转为int32/int16(需确保数值范围不溢出) - 字符串列:若存在大量重复值,转为
category类型
# 优化TRAIN的数值列 TRAIN = TRAIN.astype({col: 'float32' for col in TRAIN.select_dtypes('float64').columns}) # 优化STUDENT的字符串列为category STUDENT = STUDENT.astype({col: 'category' for col in STUDENT.select_dtypes('object').columns})
4. 分块处理数据
将TRAIN拆分为多个小批次,逐个与STUDENT连接后再合并结果,避免一次性加载全量数据:
chunk_size = 1_000_000 # 按100万行分块 # 若TRAIN来自CSV文件,直接分块读取 chunks = [] for chunk in pd.read_csv('train_data.csv', chunksize=chunk_size): chunk_join = chunk.join(STUDENT, on='UserId', how='inner') chunks.append(chunk_join) X_student = pd.concat(chunks, ignore_index=True) # 若TRAIN已在内存中,手动拆分 chunks = [TRAIN[i:i+chunk_size] for i in range(0, len(TRAIN), chunk_size)] X_student = pd.concat([chunk.join(STUDENT, on='UserId', how='inner') for chunk in chunks], ignore_index=True)
5. 使用大数据框架处理
若上述方法仍无法解决,改用Dask替代pandas,它会自动分块处理数据,无需手动管理内存:
import dask.dataframe as dd # 将pandas DataFrame转为Dask DataFrame dd_train = dd.from_pandas(TRAIN, npartitions=10) dd_student = dd.from_pandas(STUDENT, npartitions=2) # 执行连接操作 dd_result = dd_train.join(dd_student, on='UserId', how='inner') # 按需计算或导出(内存足够时再compute,否则直接导出为文件) X_student = dd_result.compute()
内容的提问来源于stack exchange,提问作者Asubramanian08
相关产品推荐
相关产品推荐

