1. 文字列連結処理をループ処理する場合、+演算子で結合するのではなく、固定文字列を事前に1つの定数にしstring.Format()でデータ部を置換する事で、2倍程度高速化できる。
2. ループ毎の結合を、メモリ確保が最初の1回で済む程度のキャパシティを設定したStringBuilderで行うことで、更に50倍程度高速化できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
using System; using System.IO; using System.Text; using System.Data; public static void RowDateToFile(DataTable dataTable, Encoding enc, ref string outputFile) { const int OneTimeWriteSize = 10485760; // 10MB const string RowFormat = "{0}" + "{1}" + "{2}" + "\r\n"; StringBuilder sb = new StringBuilder(OneTimeWriteSize * 2); foreach (DataRow dr in dataTable.Rows) { sb.Append(string.Format(RowFormat, dr["SESSIONID"].ToString(), dr["ENTRYID"].ToString(), dr["STATEMENT"].ToString())); // ある程度纏めてからファイルに書き出す。 if (sb.Length < OneTimeWriteSize) continue; File.AppendAllText(outputFile, sb.ToString(), enc); sb.Clear(); } File.AppendAllText(outputFile, sb.ToString(), enc); } |
コメント