Обратный поток - PullRequest
       19

Обратный поток

5 голосов
/ 04 июня 2010

У меня есть приложение, которое мне было поручено после очистки. Само приложение относительно простое: оно запускает SQL-запрос, использует веб-службу и записывает результаты в файл журнала. Моя работа заключается в том, чтобы архивировать файлы на наш NAS после того, как приложение с ними выполнено. Он блокирует файлы исключительно до тех пор, пока не завершит работу с ними, поэтому добавляет немного сложности. Мне также не разрешено трогать приложение, только логи. В любом случае, мое приложение довольно простое:

  1. Проверьте, можно ли открыть файл (перехватите IOException), и пометьте его как доступный в bool [], если не сгенерировано исключение.
  2. Просматривая массив файлов, помеченных как true, считывайте каждую строку файла в StreamReader, используя метод ReadLine. Поскольку приложение иногда икачивает и не завершает работу, я не могу просто использовать IOException, чтобы сказать, завершен ли файл - я должен фактически проанализировать текст.
  3. Если найден текст, указывающий на завершение, заархивируйте файл, загрузите заархивированный файл на NAS и удалите оригинал.

Мой код работает, он просто очень трудоемкий (каждый файл журнала занимает около 500 МБ). Мои мысли по улучшению включают в себя начало поиска с нижней части файла, а не с верхней части, но StreamReader не поддерживает такой метод. Я не могу использовать метод ReadToEnd, а затем выполнить обратное чтение, потому что это просто вызывает исключение нехватки памяти. Любые мысли о том, как я могу ускорить анализ файла журнала?

1 Ответ

6 голосов
/ 04 июня 2010

Я полагаю, вы ищете один маркер в конце файла, чтобы определить, закончен ли он?Если это так, я также предполагаю, что маркер имеет известную длину, например, один байт или последовательность из 3 байтов и т. Д.

Если приведенные выше предположения верны, вы можете открыть FileStream, Seek *От 1004 * до конца файла минус ожидаемая длина маркера считывается в байтах, и если маркер присутствует и заполнен, вы знаете, что можете обработать файл.

Поиск до конца -3 байта можно выполнить с помощью кодакак следующий

// Seek -3 bytes starting from the end of the file
fileStream.Seek(-3, SeekOrigin.End);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...