在大型Json文件中查找文本

时间:2017-05-15 12:48:53

标签: c++ json file search mmap

我有一个看起来像这样的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"
            }
        ]
    }

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

我尝试用mmap函数打开它并获取指向文件开头的指针。但问题是如何与特定timestamp联系并获取valueTimestamp始终按排序顺序排列。对大字符数组进行线性搜索不是时间有效的。可能是二进制搜索可以工作,但我不知道如何应用这些数据。

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

JSON文件的格式是文本。

3 个答案:

答案 0 :(得分:1)

如果您的文件太大,那么只需手动执行,因为您建议自己使用二进制搜索。 首先,找出文件大小,第一个timeStamp和最后一个timeStamp的值。然后只需将文件读取指针定位到文件的中间,然后按char读取char,直到找到{,然后从那里读取valuetimeStamp。然后根据您阅读的timeStamp,您可以决定继续使用"二进制文件"搜索范围。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

(请注意,对于Stack Overflow,要求推荐这样的库是显式偏离主题。)