Ubuntu服务器运行Python脚本报错:free(): invalid pointer 求助
解决Python在Ubuntu服务器上触发
free(): invalid pointer核心转储的问题 看起来你遇到了一个底层内存错误,这类问题通常不是Python代码逻辑本身的问题,而是依赖库的底层C扩展冲突、文件读取异常或者环境兼容性导致的。结合你的代码和运行环境(Python3.6.3,Ubuntu服务器),我整理了几个可行的解决方向:
1. 先修正代码里的明显bug
你的代码里有个变量未定义的问题,虽然你说本地运行正常,但这个bug可能在某些场景下触发未预期的行为,甚至间接导致底层错误:
# 原错误代码 name = patient_name.partition('_raw')[0] # 修正为(应该用前面定义的name变量) name = name.partition('_raw')[0]
2. 重新安装兼容的依赖库版本
Python3.6.3已经是停止维护的老旧版本,服务器上的pandas/numpy可能是通过系统包管理器安装的,和pip版本存在冲突,或者使用了不兼容的新版本依赖。建议重新安装支持Python3.6的最后几个稳定版:
# 强制重新安装指定版本,避免依赖冲突 pip install --force-reinstall pandas==1.1.5 numpy==1.19.5
这些版本是官方支持Python3.6的最后稳定版,能最大程度避免底层C代码的兼容性问题。
3. 排查文件读取的潜在问题
服务器上的TSV文件可能和本地存在编码、换行符差异,或者文件本身有损坏,这会导致pandas的底层解析器触发内存错误:
- 在
pd.read_csv中明确指定编码,比如encoding='utf-8'或者encoding='latin-1'(根据文件实际编码调整) - 添加异常捕获,避免单个文件出错导致整个程序崩溃:
try: group_vcf_to_df = pd.read_csv( file, delimiter='\t', header=0, index_col=False, low_memory=False, usecols=['A', 'B', 'C', 'D'], encoding='utf-8' ) # 后续处理逻辑... except Exception as e: print(f"处理文件 {file} 时出错: {str(e)}") continue
4. 替换glob模块,避免潜在内存问题
旧版本的glob模块在某些场景下可能存在内存泄漏,建议用更高效的os.scandir替代:
def get_list_of_group_df(filepath): all_group_df_list = [] dir_path = os.path.dirname(filepath) with os.scandir(dir_path) as entries: for entry in entries: if entry.is_file() and entry.name.endswith('.tsv'): file = entry.path name = os.path.basename(file) name = name.partition('_raw')[0] try: # 读取和处理逻辑... except Exception as e: print(f"错误处理文件 {file}: {e}") continue return all_group_df_list
5. 检查服务器内存使用情况
核心转储也可能是内存不足导致的——pandas读取大文件时会占用大量内存,如果服务器内存不够,会触发底层C库的内存错误:
- 用
free -h命令查看服务器内存剩余 - 如果内存不足,改用分块读取文件:
chunk_list = [] for chunk in pd.read_csv( file, delimiter='\t', header=0, index_col=False, low_memory=False, usecols=['A', 'B', 'C', 'D'], chunksize=10000 # 每次读取1万行,可根据内存调整 ): chunk = chunk.drop_duplicates() chunk_list.append(chunk) group_vcf_to_df = pd.concat(chunk_list, ignore_index=True)
按照这个顺序排查,应该能解决你的问题。
内容的提问来源于stack exchange,提问作者Bella




