2008-10-17 5 views
2

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

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

+0

Я надеюсь, что это займет намного меньше 1 секунды. 2.5MB на самом деле очень небольшое количество данных ... – 2008-10-17 13:40:26

+0

Я знаю, у меня был бесконечный цикл, поэтому это заняло так много времени, чтобы отдохнуть. Думаю: D – 2008-10-17 13:52:15

ответ

6

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

Где находится файл? Находится ли она в сломанной сетевой доле?

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

+0

Не в тему, но Джон, мне понравилась ваша внешность на Dot Net Rocks. – 2008-10-17 13:29:08

+0

@Giovanni: Отлично - было очень весело, если немного нервничать. – 2008-10-17 13:38:52

+1

Вы пропустили бесконечный цикл, который указал Маркус. – Kevin 2008-10-17 13:45:40

2

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

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

+1

Это хороший совет. У меня был коллега, который, казалось, думал, что ему нужен всего 300 + МБ XML-файл в памяти сразу. Не работает слишком хорошо. – 2008-10-17 13:37:46

1

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

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

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

8
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, "")

3

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

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


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

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

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

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

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

1

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

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

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

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

Надеется, что это поможет вам. и для получения дополнительной информации, пожалуйста, перейдите по следующей ссылке: Fastest Way to Read Text Files