在大型 Json 文件中查找文本

Posted

技术标签:

【中文标题】在大型 Json 文件中查找文本【英文标题】:Finding text in a large Json file 【发布时间】:2017-10-14 06:25:47 【问题描述】:

我有一个如下所示的 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"
            
        ]
    

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

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

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

JSON 文件格式为文本。

【问题讨论】:

我知道这可能有点晚了,但这里的好处之一是时间戳按排序顺序出现。作为开始的一个步骤,利用它将文件分成多个较小的部分。然后继续你的二分搜索想法。您可能可以将文件放入内存并使其非常快。 【参考方案1】:

要么自己解析文本文件(如果您可以针对非常特定的格式进行优化,这可能会更快),或者搜索流式 JSON 解析库。然后当你找到你想要的元素时,跳出解析器。

(请注意,要求此类库的推荐明确与 Stack Overflow 无关)。

【讨论】:

【参考方案2】:

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

【讨论】:

不错的建议,我一定会试试的。还有一件事,我正在使用 strstr 函数在 char 数组中搜索所需的文本。有没有其他方法可以通过更高的时间优化来完成此操作 是的,如果您需要从 mmaped 文件中的任何随机位置搜索 "timeStamp": ,strstr 就可以完成此任务。如果您从文件中的随机位置读取大约 256 个字节,那么您也可以使用 strstr,然后在此缓冲区中搜索您的 "timeStamp": 【参考方案3】:

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

【讨论】:

以上是关于在大型 Json 文件中查找文本的主要内容,如果未能解决你的问题,请参考以下文章

在文件中查找和替换文本

查找文本文件中至少有两个共同单词的所有行(Bash)

如何创建正则表达式来查找 JS 文件(或 JSON)中的所有字符串

在拆分为多个文件的大型数据框中查找重复行和包含重复行的文件

一种在大型 Xcode 项目中查找孤立图像的方法

json为txt文本加密