У меня есть огромный файл журнала в такой структуре:
"timestamp": { "identifier": value}
"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},
Я хочу извлечь содержимое после (!) заданной временной метки, например:
std::ifstream * myfunc( uint32_t timestamp)
пример:
myfunc(1463403611);
/* returns
"1463403611":{"AA":77.64},
"1463403612":{"AA":33.39},
"1463403613":{"AA":69.2},
*/
Файл журнала длинный - слишком длинный, чтобы сохранить его в памяти. Код будет работать на ограниченном ресурсе встроенных устройствах (80Mhz, ~ 10kB свободной памяти), поэтому Im ищет некоторые идеи для эффективного решения.
В файле журнала могут быть записи 500k +, и в 99% случаев отметка времени будет в последних 100 строках, поэтому начало в начале файла и проверка каждой строки для правильной временной метки будет очень неэффективной.
Итак, я предполагаю, что Im ищет решение для чтения файла в обратном направлении, по строкам. У меня действительно нет решения, как сделать это эффективно, не загружая большие куски в память.
Я пробовал читать в кусках 200 байт, начиная с EOF, но столкнулся с проблемой, что во многих случаях кусок сокращает временную метку на половину. Я попытался обнаружить это и повторно выбрать некоторые байты, если это необходимо, но почувствовал, что должно быть решение для смартфонов.