Чтение из файла недостаточно быстро, как бы я ускорил его?
-
03-07-2019 - |
Вопрос
Вот как я читаю файл:
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 "";
}
}
Надеюсь, это поможет вам. и для получения дополнительной информации, пожалуйста, посетите следующую ссылку- Самый быстрый способ чтения текстовых файлов