1. 文字列連結処理をループ処理する場合、+演算子で結合するのではなく、固定文字列を事前に1つの定数にしstring.Format()でデータ部を置換する事で、2倍程度高速化できる。
2. ループ毎の結合を、メモリ確保が最初の1回で済む程度のキャパシティを設定したStringBuilderで行うことで、更に50倍程度高速化できる。
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);
}
サンプルプログラム実行に必要な参照。
using System;
using System.IO;
using System.Text;
using System.Data;
最近のコメント