#!/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
}
版权属于:
mrui
评论 (0)