2012-03-19 2 views
0

Я разбираю текстовый файл размером до 35 МБ.Попытка избежать чтения файла дважды

настоящее время у меня этот код:

const string show_BLOCK_DELIMITER = "show "; 
const string Show_BLOCK_DELIMITER = "Show "; 
const string Begin_SHOW_HW_DELIMITER = @"show hardware internal errors"; 

и эту логику, которая контролирует то, что для захвата:

if ((line == null) || (trimmed.StartsWith(show_BLOCK_DELIMITER)) 
    || (trimmed.StartsWith(Show_BLOCK_DELIMITER)) 
|| (trimmed.Contains(Begin_SHOW_HW_DELIMITER))) 
    { 
    //stuff happens here 
    } 

То, как я захвачу читать файл и когда я ударил линию, которая начинается с 'show' или 'Show' Я проверяю его, чтобы увидеть, что это то, что я хочу захватить. Если это так, я начинаю захватывать до следующей строки, которая начинается с «show» или «Show». Новый код должен захватывать материал между константой «Begin_SHOW_HW_DELIMTER», кроме как здесь есть образец ввода. То, что я должен получить, это 2 блока или строки, каждый из которых начинается с «Module-N #». Поскольку те строки с fc-mac в них начинаются с «show», но не входят в список того, что я хочу захватить код думает, что это новый блок, и они не попадают в плен. На данный момент мне интересно узнать о отдельном методе обработки этой новой части и просто прочитать файл дважды. Операторы if/else уже довольно запутаны.

модуль-1 # показать внутренние ошибки аппаратных

show hardware internal fc-mac port 1 interrupt-counts

show hardware internal fc-mac port 2 interrupt-counts

модуль-2 # показать внутренние ошибки аппаратных

show hardware internal fc-mac port 1 interrupt-counts

show hardware internal fc-mac port 2 interrupt-counts

+0

Где находится эта страница, где вы дважды читаете файл? – Ryan

+0

@minitech Извините, я не понял. Пока еще нет. Я стараюсь избегать этого, но задаюсь вопросом, является ли он менее эффективным, чем добавление дополнительных проверок в мои уже запутанные if/else. Я бы разобрал файл один раз перед существующими захватами, которые у меня есть, а затем проанализируйте его снова для новых захватов, которые я хочу. Новый вход прерывает существующую логику без нескольких дополнительных проверок специального случая. –

ответ

0

Если у вас проблемы с производительностью, ваши условные операторы намного дешевле, чем чтение на диске, поэтому чтение файла дважды приведет к снижению производительности.

Теперь сложные условные операторы уменьшают ремонтопригодность и вводят возможности для ошибок.

Что вы могли бы сделать, это то, что вы можете прочитать файл в памяти (просто загрузите все строки в массив), а чтение файла дважды потребует меньше времени, но вы будете использовать больше памяти.

+0

Не проблема с производительностью, а проблема с существующей логикой. Чтение файла дважды не было бы суперэффективным. У сложных условностей есть свои проблемы. То, что я могу сделать с массивом, - это прочитать весь файл, найти индексы начала и окончания, а затем захватить их как блок. Это означало бы переработку существующей логики, но я думаю, что это нужно сделать в любом случае. –

Смежные вопросы