Самый эффективный способ чтения файла

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

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


person Jay    schedule 09.02.2012    source источник
comment
У тебя 4.0 или 2/3.5?   -  person Aaron McIver    schedule 09.02.2012


Ответы (4)


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

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

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

person Oded    schedule 09.02.2012
comment
Это доступно только в .NET 4 или выше. Просто кое-что, чтобы указать, не уверен, что использует OP. - person Aaron McIver; 09.02.2012
comment
Я был почти уверен, что использовал это в 3.5, может быть, это File.ReadAllText, который возвращает массив строк - person Venki; 10.02.2012

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

person Ryathal    schedule 09.02.2012
comment
ну, файлы являются результатом внешнего оборудования, которое будет иметь форму файлов и на самом деле большое количество файлов ... любой способ эффективного чтения файлов будет оценен - person Jay; 09.02.2012

Не уверен, что это самый эффективный, но мне он подходит: 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);
        }
    }
person David Welker    schedule 09.02.2012
comment
Что я делаю после этого, а не просто записываю строку в консоль, конвертирую строку в массив и импортирую данные в таблицу базы данных. Кажется, что он работает очень быстро через файл с разделителями табуляции, но мне вряд ли когда-либо придется просматривать с ним более пары тысяч записей. - person ; 09.02.2012
comment
Если вы не делаете что-то особенное с StreamReader, чего в этом примере нет, вы можете просто написать foreach(var line in File.ReadLines(path)) { Console.WriteLine(line); }. - person Philip; 10.02.2012

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

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

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

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

Удачи.

person Caleb    schedule 09.02.2012