在巨大的.ndjson文件上验证并报告错误!的最快方法是什么?

问题描述

我有一个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")