sql >> データベース >  >> RDS >> Mysql

大きなデータテーブルデータをC#Windowsアプリケーションの.csvファイルにエクスポートする

    StreamWriter.Write(..)を呼び出す代わりに 常にStringBuilderの使用を検討することができます 。すべての文字列をBuilderに追加し、ディスクに1回だけ書き込みます

    string filePath = @"e:\temp\test.csv";
    string delimiter = ",";
    
    #region init DataTable
    DataTable dt = new DataTable();
    dt.Columns.Add(new DataColumn("a", typeof(string)));
    dt.Columns.Add(new DataColumn("b", typeof(string)));
    dt.Columns.Add(new DataColumn("c", typeof(string)));
    dt.Columns.Add(new DataColumn("d", typeof(string)));
    dt.Columns.Add(new DataColumn("e", typeof(string)));
    dt.Columns.Add(new DataColumn("f", typeof(string)));
    dt.Columns.Add(new DataColumn("g", typeof(string)));
    dt.Columns.Add(new DataColumn("h", typeof(string)));
    dt.Columns.Add(new DataColumn("i", typeof(string)));
    dt.Columns.Add(new DataColumn("j", typeof(string)));
    dt.Columns.Add(new DataColumn("k", typeof(string)));
    dt.Columns.Add(new DataColumn("l", typeof(string)));
    dt.Columns.Add(new DataColumn("m", typeof(string)));
    dt.Columns.Add(new DataColumn("n", typeof(string)));
    dt.Columns.Add(new DataColumn("o", typeof(string)));
    dt.Columns.Add(new DataColumn("p", typeof(string)));
    
    for (int i = 0; i < 100000; i++)
    {
        DataRow dr = dt.NewRow();
        for (int j = 0; j < dt.Columns.Count; j++)
        {
            dr[j] = "test" + i + " " + j;
        }
        dt.Rows.Add(dr);
    }
    #endregion
    
    Stopwatch sw = new Stopwatch();
    sw.Start();
    StringBuilder sb = new StringBuilder();
    foreach (DataRow dr in dt.Rows)
    {
        sb.AppendLine(string.Join(delimiter, dr.ItemArray));
    }
    File.WriteAllText(filePath, sb.ToString());
    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds);
    Console.ReadLine();
    

    編集

    100000行で271ミリ秒かかり、約18MBのファイルが作成されました

    @aiodintsovが指摘したように、StringBuilderの使用に問題がある可能性があります 複数のMBがある場合 データの。そこで、彼のコメントに従って例を作成しました。私のためにうまくいった。エクスポートされた2685ミリ秒以内に1000000行

    Stopwatch sw = new Stopwatch();
    sw.Start();
    using (StreamWriter swr = 
             new StreamWriter(File.Open(filePath, FileMode.CreateNew), Encoding.Default, 1000000))
             // change buffer size and Encoding to your needs
    {
        foreach (DataRow dr in dt.Rows)
        {
            swr.WriteLine(string.Join(delimiter, dr.ItemArray));
        }
    }
    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds);
    


    1. 複数の値の個別の行の数をカウントします

    2. MySQLの異なる引用符

    3. 複数の列テーブルへの複数のMYSQLクエリ

    4. レコードの作成時間を主キーとして使用してみませんか?