Чтение из файла недостаточно быстро, как бы я ускорил его?
Вот как я читаю файл:
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 ответов
Оставляя в стороне ужасные имена переменных и отсутствие оператора using (вы не закроете файл, если есть какие-либо исключения), это должно быть хорошо, и, конечно, не должно занять 5 минут, чтобы прочитать 2,5 мегабайта.
Где находится файл? Это на ненадежном сетевом ресурсе?
Кстати, единственная разница между тем, что вы делаете, и использованием File.ReadAllText, заключается в том, что вы теряете разрывы строк. Это умышленно? Сколько времени занимает ReadAllText?
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, "")
Маркус Грип понял это правильно. Это займет так много времени, потому что у вас бесконечный цикл. скопировал ваш код и внес свои изменения, и он прочитал текстовый файл размером 2,4 М менее чем за секунду.
но я думаю, что вы можете пропустить первую строку файла. Попробуй это.
S = SR.ReadLine();
while (S != null){
stringFromFile.Append(S);
S = SR.ReadLine();
}
Вам нужно сразу 2,5 Мб памяти?
Если нет, я бы попробовал работать с тем, что вам нужно.
Попробуйте это, должно быть намного быстрее:
var str = System.IO.File.ReadAllText(path);
return str.Replace(Environment.NewLine, "");
Вместо этого используйте System.IO.File.RealAllLines.
http://msdn.microsoft.com/en-us/library/system.io.file.readalllines.aspx
В качестве альтернативы, оценка количества символов и передача его конструктору StringBuilder в качестве емкости должна ускорить его.
Кстати, в следующий раз, когда вы окажетесь в подобной ситуации, попробуйте предварительно выделить память. Это значительно улучшает время выполнения независимо от того, какие именно структуры данных вы используете. Большинство контейнеров (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 "";
}
}
Надеюсь, что это поможет вам. и для получения дополнительной информации, пожалуйста, посетите следующую ссылку - самый быстрый способ чтения текстовых файлов