0

私はこのようなものを持っています:

using (SqlDataAdapter a = new SqlDataAdapter(query, c))
            {
                // 3
                // Use DataAdapter to fill DataTable
                DataTable t = new DataTable();
                a.Fill(t);

                string txt = "";
                for (int i = 0; i < t.Rows.Count; i++)
                {
                    txt += "\n" + t.Rows[i][0] + "\t" + t.Rows[i][1] + "\t" + t.Rows[i][2] + "\t" + t.Rows[i][3] + "\t" + t.Rows[i][4] + "\t" + t.Rows[i][5] + "\t" + t.Rows[i][6] + "\t" + t.Rows[i][7] + "\t" + t.Rows[i][8] + "\t" + t.Rows[i][9] + "\t" + t.Rows[i][10] + "\t" + t.Rows[i][11] + "\t" + t.Rows[i][12] + "\t" + t.Rows[i][13] + "\t" + t.Rows[i][14] + "\t" + t.Rows[i][15] + "\t" + t.Rows[i][16] + "\t" + t.Rows[i][17] + "\t" + t.Rows[i][18] + "\t" + t.Rows[i][19];
                }


            }

後でtxtファイルを生成するには、列の間にこのタブが必要です。問題は、t.Rows.Count = 600000 であり、このループが 9 時間動作することです。これをより速くする方法はありますか?

よろしくカジク

4

4 に答える 4

8

StringBuilder文字列を連結する代わりにa を使用します。

            string txt = "";
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < t.Rows.Count; i++)
            {
                sb.Append(t.Rows[i][0]); 
                sb.Append("\t");
                sb.Append(t.Rows[i][1]);
                //and so on...
           }
           string txt = sb.ToString();

文字列を別の文字列に追加する (再度割り当てることによって) には、結合された文字列の長さに比べて労力がかかります。これは、大きな文字列の場合、非常に高速になります。これは、画家のシュレミエルのアルゴリズムです。a を使用するStringBuilderと、コンテンツに新しい文字列を追加するたびに新しい文字列を作成する必要がないため、これを回避できます。

ファイルに書き出すためだけにこのデータをすべてメモリに保持する理由について質問する必要があります-テキストコンテンツを1行ずつ生成できるモデルに切り替える必要があります。代わりにデータリーダーを使用することをお勧めしますテキスト行を生成するメソッド、例えば:

public IEnumerable<string> GenerateTextOutput()
{
   //...
   //using SqlDataReader instead
   while(reader.Read())
   {
     //assemble string for next row
     string txt = "...";
     yield return txt;
   }
}

次に、この出力をディスクに書き込むことができます。

File.WriteAllLines("foo.txt", GenerateTextOutput());
于 2012-04-26T20:28:53.587 に答える
4

StringBuilder を使用します。Web 上のあらゆる場所で例を見つけることができます。

于 2012-04-26T20:28:59.873 に答える
2

他の人が言及StringBuilderしましたが、それらは正しいです。ただし、.NET 4 では StringBuilder がより効率的になり、再割り当てとメモリのコピーが完全に回避されることに注意してください。以前のバージョンの .NET を使用している場合、パフォーマンスが低下します。それはまだあなたがしていることを打ち負かします。

txt準備ができた後、何をしているのだろうか。文字列をメモリに保存することを完全に避け、ファイルに直接書きたいと思うかもしれません (ユーザーに 600,000 行を表示しているとは思いません...)

于 2012-04-26T20:37:15.093 に答える
0

StringBuilder他の人によってすでに言及されており、大きな利益をもたらすはずです。

テキスト全体を 600K 行のメモリに保持する必要が本当にあるのでしょうか? ファイルに直接書き込むことで、これを大幅に高速化できます。

また、反復回数が多い場合、Rows[i] を変数に割り当てると、さらに高速化される可能性があります。

于 2012-04-26T20:33:43.210 に答える