问题描述
我有一个42 GB的文件,其中每行应该是一个JSON对象。我有理由相信该文件中某处存在语法错误。
一些约束:
- 该行大约有21000行,所以其中一些很长(!!!)长
- 我不想只找到第一个错误;我想找到有错误的 all 行
- 我希望输出至少显示有问题的行的行号(或行内容)
- 我正在Windows或(最好是)Ubuntu上(通过WSL2)执行此操作
此脚本的前1000行(约1.2 GB)花费了大约1分钟的时间,目前正在完整文件上运行:
#!/bin/bash
i=$((0))
time (
while read line; do
i=$((i + 1))
echo "$line" | jq > /dev/null || echo error on line $i &
done < blob_cache_update-20200812T034630.ndjson
wait
echo processed $i rows
)
我该怎么做才能使速度更快?
(是的,可以尝试使用其他语言,假设安装必需的工具和实施检查器非常简单,不会完全掩盖运行检查器。)
解决方法
显然,要做的第一件事就是切换到Python。
这种(单线程!)方法在同一文件上花费了5分钟:
#!/bin/env python
import json
import time
# FILE = 'blob_cache_update-sample.ndjson'
FILE = 'blob_cache_update-20200812T034630.ndjson'
start = time.perf_counter()
with open(FILE,'r') as f:
for i,line in enumerate(f):
if i % 1000 == 0:
print(f'{i}: {time.perf_counter() - start} s')
try:
parsed = json.loads(line)
assert "blob" in parsed
assert "sha" in parsed
assert "size" in parsed
except:
print(f'error on line {i}')
end = time.perf_counter()
print(f"it took {end-start} s")