Чтение из файла недостаточно быстро, как бы я ускорил его?

StackOverflow https://stackoverflow.com/questions/212089

Вопрос

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

    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 секунды ...:)

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

return System.IO.File.ReadAllText(path);

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

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


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

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

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

Вместо этого используйте System.IO.File.RealAllLines.

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

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

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

var str = System.IO.File.ReadAllText(path);
return str.Replace(Environment.NewLine, "");

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

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

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

(приведение необходимо, потому что System.IO.FileInfo.Length имеет длину long .)

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

string fileContent = System.IO.File.ReadAllText(txtFilePath.Text)
string[] arr = fileContent.Split('\n');

Цикл и StringBuilder могут быть избыточными; Попробуйте использовать ReadToEnd .

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

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 "";
        }
    }

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top