Чтение из файла недостаточно быстро, как бы я ускорил его? - PullRequest
2 голосов
/ 17 октября 2008

Вот как я читаю файл:

    public static string readFile(string path)
    {
        StringBuilder stringFromFile = new StringBuilder();
        StreamReader SR;
        string S;
        SR = File.OpenText(path);
        S = SR.ReadLine();
        while (S != null)
        {
            stringFromFile.Append(SR.ReadLine());
        }
        SR.Close();
        return stringFromFile.ToString();
    }

Проблема в том, что он такой длинный (у файла .txt около 2,5 мегабайт) Заняло 5 минут. Есть ли лучший способ?

Решение принято

    public static string readFile(string path)
    {

       return File.ReadAllText(path);

    }

Заняло менее 1 секунды ...:)

Ответы [ 11 ]

8 голосов
/ 17 октября 2008
S = SR.ReadLine();
while (S != null)
{
    stringFromFile.Append(SR.ReadLine());
}

Следует отметить, что S никогда не устанавливается после этой начальной ReadLine(), поэтому условие S != null никогда не срабатывает, если вы входите в цикл while. Попробуйте:

S = SR.ReadLine();
while (S != null)
{
    stringFromFile.Append(S = SR.ReadLine());
}

или используйте один из других комментариев.

Если вам нужно удалить переводы строки, используйте string.Replace (Environment.NewLine, "")

6 голосов
/ 17 октября 2008
return System.IO.File.ReadAllText(path);
6 голосов
/ 17 октября 2008

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

Где находится файл? Это на ненадежном сетевом ресурсе?

Кстати, единственное различие между тем, что вы делаете, и использованием File.ReadAllText, заключается в том, что вы теряете разрывы строк. Это умышленно? Сколько времени занимает ReadAllText?

3 голосов
/ 17 октября 2008

Маркус Грип правильно понял. Это занимает так много времени, потому что у вас бесконечный цикл. скопировал ваш код и внес изменения, и он прочитал текстовый файл размером 2,4 М менее чем за секунду.

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


S = SR.ReadLine();
while (S != null){
    stringFromFile.Append(S);
    S = SR.ReadLine();
}

2 голосов
/ 17 октября 2008

Вам нужно сразу 2,5 Мб памяти?

Если нет, я бы попробовал работать с тем, что вам нужно.

1 голос
/ 05 декабря 2012

ReadAllText был очень хорошим решением для меня. Я использовал следующий код для 3.000.000 текстового файла строки, и это заняло 4-5 секунд, чтобы прочитать все строки.

string fileContent = System.IO.File.ReadAllText(txtFilePath.Text)
string[] arr = fileContent.Split('\n');
1 голос
/ 17 октября 2008

Кстати: в следующий раз, когда вы окажетесь в подобной ситуации, попробуйте предварительно выделить память. Это значительно улучшает время выполнения независимо от того, какие именно структуры данных вы используете. Большинство контейнеров (StringBuilder также) имеют конструктор, который позволяет резервировать память. Таким образом, во время чтения необходимо меньше перераспределения времени.

Например, вы можете написать следующее, если хотите прочитать данные из файла в StringBuilder:

var info = new FileInfo(path);
var sb = new StringBuilder((int)info.Length);

(Необходимый состав, потому что System.IO.FileInfo.Length равен long.)

1 голос
/ 17 октября 2008

Попробуйте, должно быть намного быстрее:

var str = System.IO.File.ReadAllText(path);
return str.Replace(Environment.NewLine, "");
1 голос
/ 17 октября 2008

Используйте взамен System.IO.File.RealAllLines.

http://msdn.microsoft.com/en-us/library/system.io.file.readalllines.aspx

В качестве альтернативы, оценка количества символов и передача его конструктору StringBuilder по мере увеличения емкости.

0 голосов
/ 23 июня 2016

Для быстрого чтения текстового файла вы можете использовать что-то вроде этого

public static string ReadFileAndFetchStringInSingleLine(string file)
    {
        StringBuilder sb;
        try
        {
            sb = new StringBuilder();
            using (FileStream fs = File.Open(file, FileMode.Open))
            {
                using (BufferedStream bs = new BufferedStream(fs))
                {
                    using (StreamReader sr = new StreamReader(bs))
                    {
                        string str;
                        while ((str = sr.ReadLine()) != null)
                        {
                            sb.Append(str);
                        }
                    }
                }
            }
            return sb.ToString();
        }
        catch (Exception ex)
        {
            return "";
        }
    }

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

...