スポンサーリンク

C#のファイル書き込み高速化

C#

DataGridViewに5万行を表示し、選択可能最大行数(5万行)を、現実的な処理時間で、CSVファイルとして保存するコードが出来た!

1.最初はStreamWriterクラスを用いたが、.Net framework のバグで、メモリを限界まで使用する現象が発生し、アプリケーションが必ずハングする。試行錯誤したが、StreamWriterクラスでは無理だった。

2.FileクラスのAppendAllTextを用いる事で、安定的にファイル書き込み処理が実行されるようになったが、書き込みが終わるまで数時間かかってしまう。

3.FileクラスのAppendAllTextを、1行単位に実行するのではなく、1000行単位に実行するようにしたら、2分程度で5万行のファイル書き込みが完了するようになった。

 

最終的に出来上がったソースはこちら。

using System.IO;

private static void Writeグリッド明細_Selected(string str保存先ファイルパス, DataGridView grid, int i開始列)
{
 int iRowCnt = 0;
 string strRowData = "";

 foreach (DataGridViewRow row in grid.SelectedRows)
 {
  for (int iCol = i開始列; iCol < row.Cells.Count; iCol++)
  {
   strRowData += "\"" + row.Cells[iCol].FormattedValue.ToString() + "\"";

   if ((grid.Columns.Count – 1) > iCol)
    strRowData += ",";
  }

  string strTmp = strRowData.Replace(",", "").Replace("\"", "");
  if (strTmp.Length == 0)
   continue;

  if (iRowCnt < 1000)
  {
   strRowData += "\r\n";
   iRowCnt++;
  }
  else
  {
   File.AppendAllText(str保存先ファイルパス, strRowData + "\r\n", Encoding.GetEncoding("Shift_JIS"));
   iRowCnt = 0;
   strRowData = "";
  }
 }

 if (strRowData != "")
  File.AppendAllText(str保存先ファイルパス, strRowData + "\r\n", Encoding.GetEncoding("Shift_JIS"));
}

コメント

タイトルとURLをコピーしました