You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动