标签搜索

TB级大文件处理脚本

mrui
2025-09-11 / 0 评论 / 4 阅读 / 正在检测是否收录...
#!/bin/bash
# 处理TB级别日志文件的技巧

process_huge_file() {
    local file=$1
    local chunk_size=${2:-1000000}  # 默认100万行一个块
    
    echo "处理大文件: $file ($(du -h "$file" | awk '{print $1}'))"
    
    # 方法1: 分块处理
    split -l "$chunk_size" "$file" "chunk_"
    
    for chunk in chunk_*; do
        echo "处理块: $chunk"
        
        # 并行处理每个块
        {
            awk '{
                # 你的处理逻辑
                ip_count[$1]++
            } END {
                for (ip in ip_count) {
                    print ip, ip_count[ip] > "result_'$chunk'.txt"
                }
            }' "$chunk"
            
            rm "$chunk"  # 处理完立即删除
        } &
        
        # 控制并发数
        (($(jobs -r | wc -l) >= 4)) && wait
    done
    
    wait  # 等待所有后台任务完成
    
    # 合并结果
    echo "合并结果..."
    awk '{sum[$1] += $2} END {
        for (ip in sum) print ip, sum[ip]
    }' result_chunk_*.txt | sort -k2 -nr > final_result.txt
    
    rm result_chunk_*.txt
}

# 方法2: 流式处理 (内存占用最小)
stream_process() {
    local file=$1
    
    # 使用管道流式处理,内存占用恒定
    cat "$file" | \
    awk '{
        # 每处理10万行输出一次中间结果
        if (NR % 100000 == 0) {
            print "处理进度:", NR > "/dev/stderr"
        }
        
        # 你的处理逻辑
        ip_count[$1]++
        
        # 定期清理内存 (保留热点数据)
        if (NR % 1000000 == 0) {
            for (ip in ip_count) {
                if (ip_count[ip] < 10) delete ip_count[ip]
            }
        }
    } END {
        for (ip in ip_count) {
            print ip, ip_count[ip]
        }
    }' | sort -k2 -nr
}
0

评论 (0)

取消