2016-07-21 4 views
0

У меня есть процесс, который получает много строк таблицы. Эти строки должны быть представлены в отчете. То, что я делаю на данный момент, слишком медленное, потому что так много строк (600.000 < = x) -Rows. я покажу, что я делаю сейчас, чтобы дать вам представление о том, что я делаю:Написание многих строк в файл эффективно

private void ShowNotFoundRows() { 

     report += "NOT FOUND - Rows"; 
     report += "\r\n"; 
     report += "In Current:"; 
     report += "\r\n"; 
     string Columns = "|"; 
     foreach (string header in currentModel.Columns) { 
      Columns += header + "|"; 
     } 
     report += Columns; 
     report += "\r\n"; 
     foreach (string row in newModel.Keys) { 
      report += row + "\r\n"; 
     } 
     report += "\r\n"; 
     report += "In New:"; 
     report += "\r\n"; 
     report += Columns; 
     report += "\r\n"; 
     foreach (string row in currentModel.Keys) { 
      report += row + "\r\n"; 
     } 
} 

и после:

 private void CreateReportFile() { 
     MyLog.WriteToLog("Creating ReportFile "+newModel.TableName, MyLog.Messages.Info); 
     string dir = Settings.Default.ReportFolder + "\\" + directoryName + " " + DateTime.Now.ToString("dd-MM-yyyy"); 
     Directory.CreateDirectory(dir); 

     try { 
      File.WriteAllText(dir + "\\Report " + newModel.TableName, report); 
     } catch (DirectoryNotFoundException e) { 

      Console.WriteLine(e.Message + "\n" + e.StackTrace); 
     } 
    } 
+0

Одна вещь, которую вы можете сделать, это использовать 'StringBuilder' вместо того, чтобы делать так много конкатенаций строк. Вы можете увидеть значительное улучшение с этим небольшим изменением. – itsme86

ответ

1

Пуск с помощью StringBuilder и посмотреть, где что получает вас , Вы копируете много памяти с помощью stringx = stringx + stringy, потому что он создает новый объект и копирует все его в новый объект. У меня такое чувство, что вы попадете туда, где вам нужно. Stringbuilder по контрасту предопределяет память.

Помимо этого, вы можете делать такие вещи, как разделение данных на разделы и многопоточность, а затем объединение результатов в конце.

+0

Спасибо! вот что я искал. :) – Ams1

2

Используйте StringBuilder, который является более эффективным добавлением строк. В C# "+" каждый раз создается новая строка! Используйте AppendLine, Append, AppendFormat и т. Д., И когда закончите ToString().

var report = new StringBuilder(); 
report.AppendLine("NOT FOUND - Rows"); 
report.AppendLine("In Current:"); 
... 

Тогда

File.WriteAllText(dir + "\\Report " + newModel.TableName, report.ToString()); 
+0

Sry, что я не дал вам тиканье. Но ваш тент в сочетании с другим абрисом был решением моей проблемы. Поэтому не стесняйтесь воображать гипотетический тик: P. БЛАГОДАРЯ! – Ams1

0

StringBuilder поможет вам более эффективно построить отчет в памяти. Но результат все еще сохраняется в памяти. Чтобы этого избежать, вы можете написать частичные результаты (например, по очереди), используя FileStream.

Смежные вопросы