在大型 JSON 文件中查找文本

Finding text in a large Json file

本文关键字:查找 文本 文件 大型 JSON      更新时间:2023-10-16

>我有一个看起来像这样的 JSON 文件

{
            "ID": "4",
            "samples": [
            {
                "value": 2000,
                "timeStamp": "1"
            },
            {
                "value": 2000,
                "timeStamp": "2"
            },
            {
                "value": 2000,
                "timeStamp": "3"
            },
            {
                "value": 2000,
                "timeStamp": "4"
            },
            {
                "value": 2000,
                "timeStamp": "5"
            },
            {
                "value": 2000,
                "timeStamp": "6"
            },
            {
                "value": 2000,
                "timeStamp": "7"
            },
            {
                "value": 2000,
                "timeStamp": "8"
            },
            {
                "value": 2000,
                "timeStamp": "9"
            },
            {
                "value": 2000,
                "timeStamp": "10"
            },
            {
                "value": 2000,
                "timeStamp": "11"
            },
            {
                "value": 2000,
                "timeStamp": "12"
            },
            {
                "value": 2000,
                "timeStamp": "13"
            },
            {
                "value": 2000,
                "timeStamp": "14"
            },
            {
                "value": 2000,
                "timeStamp": "15"
            },
            {
                "value": 2000,
                "timeStamp": "16"
            },
            {
                "value": 2000,
                "timeStamp": "17"
            }
        ]
    }

此示例数组可能非常大。我需要找到任何给定timestampvalue.由于 JSON 文件可能很大,我无法将其所有文件内容加载到主内存中并使用 rapidjson 或其他 JSON C++库对其进行解析。

我尝试使用mmap函数打开它并获取指向文件开头的指针。但问题是 如何到达特定timestamp并获得value . Timestamp始终按排序顺序出现。对庞大的字符数组进行线性搜索并不节省时间。可能是二进制搜索可以工作,但我不知道如何应用这些数据。

任何其他技术,如文件偏移缓存或其他东西也可以提供帮助。

JSON 文件的格式为文本。

如果您的文件太大,请按照您使用二进制搜索的建议手动执行。首先,找出文件大小,第一个timeStamp和最后一个timeStamp的值。然后只需将文件读取指针定位到文件的中间,然后逐个字符读取字符,直到找到{并从该点读取您的valuetimeStamp。然后,根据您阅读timeStamp,您可以决定需要继续"二进制"搜索的方向。

rapidjson 支持 sax 解析。 这不会完全加载到内存中,并且比解析文本更有意义。

要么自己解析文本文件(如果可以针对非常特定的格式进行优化,可能会更快(,要么搜索流式 JSON 解析库。 然后在找到所需的元素时脱离解析器。

(请注意,对于堆栈溢出来说,请求推荐这样的库显然是题外话(。