在大型 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
并获得value
。 Timestamp
总是按排序顺序出现。对巨大的字符数组进行线性搜索并不省时。可能是二进制搜索可以工作,但我不知道如何应用这些数据。
任何其他技术,如缓存文件偏移量或其他东西也可以提供帮助。
JSON 文件格式为文本。
【问题讨论】:
我知道这可能有点晚了,但这里的好处之一是时间戳按排序顺序出现。作为开始的一个步骤,利用它将文件分成多个较小的部分。然后继续你的二分搜索想法。您可能可以将文件放入内存并使其非常快。 【参考方案1】:要么自己解析文本文件(如果您可以针对非常特定的格式进行优化,这可能会更快),或者搜索流式 JSON 解析库。然后当你找到你想要的元素时,跳出解析器。
(请注意,要求此类库的推荐明确与 Stack Overflow 无关)。
【讨论】:
【参考方案2】:如果您的文件太大,那么只需按照您建议的使用二进制搜索手动执行即可。
首先,找出文件大小,第一个timeStamp
和最后一个timeStamp
的值。然后只需将文件读取指针定位到文件的中间,然后逐个字符地读取,直到找到,然后再读取
value
和timeStamp
。然后根据您阅读的timeStamp
,您可以决定继续“二进制”搜索所需的方向。
【讨论】:
不错的建议,我一定会试试的。还有一件事,我正在使用 strstr 函数在 char 数组中搜索所需的文本。有没有其他方法可以通过更高的时间优化来完成此操作 是的,如果您需要从 mmaped 文件中的任何随机位置搜索"timeStamp":
,strstr 就可以完成此任务。如果您从文件中的随机位置读取大约 256 个字节,那么您也可以使用 strstr
,然后在此缓冲区中搜索您的 "timeStamp":
【参考方案3】:
rapidjson 支持sax parsing。这不会完全加载到内存中,并且比解析文本更有意义。
【讨论】:
以上是关于在大型 Json 文件中查找文本的主要内容,如果未能解决你的问题,请参考以下文章