我有一个这种结构的巨大日志文件:
"timestamp":{"标识符":值}
"1463403600":{"AA":74.42},
"1463403601":{"AA":29.55},
"1463403603":{"AA":24.78},
"1463403604":{"AA":8.46},
"1463403605":{"AA":44.84},
"1463403607":{"AA":87.05},
"1463403608":{"AA":54.81},
"1463403609":{"AA":93.1},
"1463403611":{"AA":77.64},
"1463403612":{"AA":33.39},
"1463403613":{"AA":69.2},
Run Code Online (Sandbox Code Playgroud)
我想在(!)给定的时间戳后提取内容,如:
std::ifstream * myfunc( uint32_t timestamp)
Run Code Online (Sandbox Code Playgroud)
例:
myfunc(1463403611);
/* returns
"1463403611":{"AA":77.64},
"1463403612":{"AA":33.39},
"1463403613":{"AA":69.2},
*/
Run Code Online (Sandbox Code Playgroud)
日志文件很长 - 太长而无法将其保留在内存中.代码将在资源有限的嵌入式设备(80Mhz,~10kB可用内存)上运行,因此我正在寻找一些有效解决方案的想法.
日志文件可能有500k +条目,并且在99%的时间内,时间戳将在最后100行中,因此从文件的beginnig开始并检查每一行的正确时间戳将是非常低效的.
所以我想我正在寻找一个解决方案来逐行读取文件.我没有真正的解决方案如何在不将大块加载到内存中的情况下提高效率.
我尝试从EOF开始阅读200字节的块,但是面对这个问题,在很多情况下,块会将时间戳减少一半.我试图检测到并在需要时重新选择一些字节,但感觉必须有一个聪明的解决方案.