Я пытаюсь определить, каков наиболее эффективный способ анализа файлов .svclog.Чтобы дать вам больше контекста, файлы .svclog, с которыми я имею дело, выглядят так, как в http://msdn.microsoft.com/en-us/library/aa751795.aspx. Логика трассировки создает <E2ETraceEvent/>
элементов, а помещает их все в одну строку в a.файл svclog, так что в итоге вы получите однострочный XML-файл стоимостью 10 с, например:
<E2ETraceEvent [...]</E2ETraceEvent><E2ETraceEvent [...] </E2ETraceEvent>...
Какой мой самый эффективный способ чтения по одному элементу <E2ETraceEvent/>
за раз из этой гигантской строки?Я знаю, что существуют инструменты, которые могут в основном сделать отступ для XML и сохранить изменения либо в том же файле, либо в отдельном файле.Это дополнительный шаг, который я бы предпочел пропустить, поскольку производительность будет очень важна, учитывая количество этих файлов, которые мне, возможно, придется обработать.Я не хочу делать отступ для сотен толстых файлов, прежде чем я смогу даже начать их обработку.
Я мог бы загрузить весь файл в память и обработать его как строку (они ограничены 30 мегабайтами вв моем случае), но я предполагаю реализовать какую-то логику «объединения журналов» в будущем, где мне может понадобиться сшить сотни этих файлов, и поэтому загрузка их всех в память за раз просто не произойдет.
Я мог бы использовать регулярное выражение с "<E2ETraceEvent.*?</E2ETraceEvent>"
и продвигать по одному элементу за раз (это вообще эффективно?).Я мог бы на самом деле вручную реализовать конечный автомат, который будет читать по одному символу за раз.Это уже звучит плохо:)
Тонны вариантов, но я ищу что-то действительно чистое и элегантное.
PS.Действительно ли при синтаксическом анализе принято иметь дело с однострочными файлами?Раньше я не делал слишком много работы по анализу, но почти все инструменты, с которыми я работал, полагаются на чтение x строк одновременно.Все это становится совершенно бесполезным, как только у вас нет ни одной новой строки во всем файле.