Самый эффективный способ чтения файла - PullRequest
5 голосов
/ 09 февраля 2012

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

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

Ответы [ 4 ]

14 голосов
/ 09 февраля 2012

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

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

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

0 голосов
/ 09 февраля 2012

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

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

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

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

Удачи.

0 голосов
/ 09 февраля 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);
        }
    }
0 голосов
/ 09 февраля 2012

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

...