我有一个看起来像这样的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
联系并获取value
。 Timestamp
始终按排序顺序排列。对大字符数组进行线性搜索不是时间有效的。可能是二进制搜索可以工作,但我不知道如何应用这些数据。
任何其他技术,如缓存文件偏移量或其他东西也可以提供帮助。
JSON文件的格式是文本。
答案 0 :(得分:1)
如果您的文件太大,那么只需手动执行,因为您建议自己使用二进制搜索。
首先,找出文件大小,第一个timeStamp
和最后一个timeStamp
的值。然后只需将文件读取指针定位到文件的中间,然后按char读取char,直到找到{
,然后从那里读取value
和timeStamp
。然后根据您阅读的timeStamp
,您可以决定继续使用"二进制文件"搜索范围。
答案 1 :(得分:1)
rapidjson支持sax parsing。这并不是完全加载到内存中,而是比解析文本更有意义。
答案 2 :(得分:0)
自己解析文本文件(如果可以针对非常特定的格式进行优化,可能会更快),或者搜索流式JSON解析库。然后在找到所需元素时突破解析器。
(请注意,对于Stack Overflow,要求推荐这样的库是显式偏离主题。)