Я работаю над анализом файла журнала разумного размера (до 50 МБ, с которого он обертывает) из стороннего приложения, чтобы обнаружить KEY_STRING, которые произошли за указанное время Рамка. Типичная запись в этом файле журнала может выглядеть следующим образомАнализ файла журнала с многострочными записями
DEBUG [email protected]:23:49 [PID] - Product.Version.Module
(Param 1=blahblah Param2=blahblah Param3 =blahblah
Method=funtionname)
String that we usually don't care about but may be KEY_STRING
Записи разделяются пустой строкой (\ г \ п в конце записи затем \ г \ п до начала следующего входа)
Это для конкретной реализации Windows, поэтому ее не нужно переносить и может быть C/C++/Win32
Чтение этой строки за строкой было бы трудоемким, но было бы полезно проанализировать метку времени и проверьте, находится ли запись в течение заданного периода времени, прежде чем проверять, присутствует ли какая-либо из KEY_STRING в записи. Если я прочитаю файл кусками, я могу найти KEY_STRING, но кусок не имеет более ранней отметки времени, или граница фрагмента может даже находиться в середине KEY_STRING. Чтение всего файла в памяти и разбор его не является вариантом, так как приложение, в котором оно должно быть частью текущего, имеет относительно небольшой размер, поэтому не может оправдать увеличение этого на ~ 10x только для разбора файла (даже временно) , Есть ли способ, которым я могу прочитать файл с помощью разделенных фрагментов (в частности, «\ r \ n \ r \ n»)? Или есть другой/лучший метод, о котором я не думал?
Любая помощь на этом будет принята с благодарностью!
1) Память не может использоваться, прежде всего потому, что приложение обнаруживает, когда оно использует слишком много памяти и перезагружается. Встроенный механизм для предотвращения утечки памяти. Использование дополнительного 50 МБ памяти, безусловно, вызовет это. 2) Под этим вы хотите прочитать фрагмент (например, 1Mb) в istream, а затем называть getline()? Если да, что произойдет, если граница буфера находится между меткой времени и строкой, которую я ищу? Можно ли очистить все с начала буфера до отметки времени, а затем снова заполнить буфер из следующей части файла? – sarmstro