2012-02-09 2 views
5

У меня есть файл, который содержит определенное количество строк фиксированной длины, имеющих некоторые числа. Мне нужно прочитать каждую строку, чтобы получить это число и обработать их и записать в файл. Поскольку мне нужно читать каждую строку, так как количество строк увеличивается, это становится трудоемким.Самый эффективный способ чтения файла

Есть ли эффективный способ чтения каждой строки файла? Я использую C#.

+4

Принадлежит StackOverflow. –

+0

Вы используете 4.0 или 2/3.5? –

ответ

0

Чтение всех строк из файла всегда не менее O (n). Когда размер файла начинает становиться проблемой, тогда, вероятно, самое подходящее время для поиска базы данных для информации вместо плоских файлов.

+0

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

14

File.ReadLines (.NET 4.0+), вероятно, является наиболее эффективным для памяти способом.

Он возвращает IEnumerable<string>, что означает, что линии будут читаться лениво потоковым способом.

Предыдущие версии не имеют возможности потоковой передачи, доступной таким образом, но использование StreamReader для чтения строк за строкой обеспечило бы то же самое.

+1

Это доступно только в .NET 4 или больше. Просто что-то указать, не уверен, что использует OP. –

+0

@AaronMcIver - Хорошая точка. Ответ обновлен. – Oded

+0

Я был уверен, что использовал это в 3.5, возможно, это File.ReadAllText, который возвращает String Array – Venki

0

Не уверен, что это не является наиболее эффективным, но она хорошо работает для меня: http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx

//Declare a new file and give it the path to your file 
    FileInfo fi1 = new FileInfo(path); 

    //Open the file and read the text 
    using (StreamReader sr = fi1.OpenText()) 
    { 
     string s = ""; 
     // Loop through each line 
     while ((s = sr.ReadLine()) != null) 
     { 
      //Here is where you handle your row in the file 
      Console.WriteLine(s); 
     } 
    } 
+0

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

+0

Если вы не делаете что-то особенное с StreamReader, которое в этом примере вам нет, вы можете просто написать 'foreach (var line в File.ReadLines (путь)) {Console.WriteLine (строка); } '. – Philip

0

Независимо от того, какого операционной системы вы используете, будут несколько слоев между вашим кодом и фактическим хранением механизм. Жесткие диски и ленточные накопители хранят файлы в блоках, которые в наши дни обычно составляют около 4 тыс. Каждый. Если вы хотите прочитать один байт, устройство по-прежнему будет считывать весь блок в память - это просто быстрее. Устройство и ОС также могут хранить кеш блоков. Таким образом, вы не можете изменить стандартное (сильно оптимизированное) поведение чтения файлов; просто прочитайте файл по мере необходимости и позвольте системе заботиться обо всем остальном.

Если время для обработки файла становится проблемой, два варианта, которые могут помочь являются:

  1. Попытка организовать использовать более короткие файлы. Похоже, что вы обрабатываете файлы журналов или что-то еще - более частое использование вашей программы может помочь, по крайней мере, улучшить внешний вид.

  2. Измените способ хранения данных. Опять же, я понимаю, что файл поступает из какого-то внешнего источника, но, возможно, вы можете организовать запуск задания, которое периодически преобразует необработанный файл в то, что вы можете читать быстрее.

Удачи.

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