0

テキストファイルへの書き込みに使用する以下のコードを参照してください。しかし、データベースはほぼ 100 万件のレコードをフェッチするので、これを行うためのより高速な方法や、以下のコードをより高速に動作させるためにどのように変更すればよいか教えてください。

try
{
    using (OleDbConnection connection = new OleDbConnection(ConnectionString))
    {
        OleDbCommand command = new OleDbCommand(queryString, connection);
        connection.Open();
        OleDbDataReader reader = command.ExecuteReader();
        DataTable dt = new DataTable();
        dt.Load(reader);

        StreamWriter writer = new StreamWriter(FilePath + FileName);
        var result = string.Empty;
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                result += dt.Rows[i][j] + "|";
            }
            result += "\r\n";
        }
        writer.WriteLine(result);

        reader.Close();
        writer.Close();

        Dts.TaskResult = (int)ScriptResults.Success;
    }
}
4

1 に答える 1

0

データテーブルに 100 万件のレコードをロードし、そのテーブルで再度ループして各行を書き込みます。

おそらく同じことを行うことができますが、単一の行を読み取って書き留めると、半分の時間で済みます。

OleDbDataReader reader = command.ExecuteReader();
StreamWriter writer = new StreamWriter(FilePath + FileName);
var result = string.Empty;
while(reader.Read())
{
    for (int j = 0; j < reader.FieldCount; j++)
    {
        result += reader[j] + "|";
    }
    result += "\r\n";
}
writer.WriteLine(result);

また、 StringBuilder を使用して読み取りをメモリにバッファリングし、常にディスクに書き込むのではなく、この状況では非常に有益です。

// This size is just for example purpose. Should be fine tuned
StringBuilder buffer = new StringBuilder(1048576);
while(reader.Read())
{
    for (int j = 0; j < reader.FieldCount; j++)
    {
        buffer.Append(reader[j] + "|");
    }
    buffer.AppendLine();
    if(buffer.Length > 1048576 - 1024)
    {
        writer.Write(buffer.ToString());
        buffer.Length = 0;
    }
}
writer.Write(buffer.ToString());
于 2013-10-08T07:05:11.897 に答える