You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python逐行过滤大TSV文件无报错却停止写入的原因排查

问题

用R生成了一个约300GB的TSV表格,因p-value阈值设置宽松导致文件过大。为避免全量加载到DataFrame过滤,编写了以下Python脚本逐行处理:

infile = 'table.tsv' # ~ 300 GB
outfile = 'table.filtered.tsv'
from itertools import islice
with open(infile, 'r') as inf:
    with open(outfile, 'a') as outf:
        for line in islice(inf, 1, None): # starting from the second line
            if float(line.split('\t')[4]) <= 1e-7:
                outf.write(line)

脚本运行后,输出文件达到7.6GB时无报错停止写入,多次运行结果一致。服务器磁盘空间充足,添加outf.flush()无效,添加print(line)后发现代码仍在打印内容,说明循环仍在迭代。请问出现这种情况的原因可能是什么?

可能的原因及解决方案
  • 后续行无符合过滤条件的数据:检查输出文件最后一行对应的原文件位置,查看后续行的第5列(p-value)是否全部大于1e-7。如果数据是按p-value从低到高排序的,过滤到一定位置后就没有符合条件的行,脚本会继续迭代但不再写入内容,导致输出文件大小不再增长。
  • 目标列存在格式错误:部分行的第5列无法转换为浮点数(比如是空值、非数字字符串),或行内制表符数量不足导致索引越界,此时float()或索引操作会抛出异常。若未捕获异常,脚本会直接终止,但错误信息可能因远程终端缓冲、后台运行等原因未被发现。建议添加异常捕获来定位问题:
    for line in islice(inf, 1, None):
        try:
            p_val = float(line.split('\t')[4])
            if p_val <= 1e-7:
                outf.write(line)
        except (ValueError, IndexError) as e:
            with open('error.log', 'a') as errf:
                errf.write(f"错误行: {line.strip()}\n错误信息: {str(e)}\n")
    
  • 用户磁盘配额限制:即使服务器总磁盘空间充足,你的用户账号可能被设置了存储配额,当输出文件达到配额上限时会被系统阻止写入。可通过quota -s命令查看当前配额使用情况。
  • 文件系统单个文件大小限制:部分旧版本文件系统(如特定块大小的ext3)存在单个文件最大容量限制,可通过df -T查看文件系统类型,再查询对应文件系统的最大文件尺寸限制。

内容的提问来源于stack exchange,提问作者BolbatAV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 21:44:54