2016-09-09 6 views
0

mysqlに挿入するクエリを作成する関数を作成しました。アップロードはすばらしく高速ですが、長い値を挿入すると建物の所要時間はいくらか長くなります。このような機能をスピードアップする方法はありますか?なぜなら、ループ内のループは、より多くのデータ量を得るために多くの時間がかかることを知っているからです。Cでのqueryupbuilder(stringconcat)のスピードアップ

foreach (string[] st in dataToUpload) 
{ 
    buildQuery += " ('"; 
    for (int i = 0; i < st.Length; i++) 
    { 
     buildQuery += st[i]; 
     if (i < st.Length - 1) 
      buildQuery += "','"; 
    } 

    buildQuery += "')"; 
    if (st != dataToUpload[dataToUpload.Count - 1]) 
     buildQuery += ","; 
}   

これは、たとえばビルドしたいクエリです。

string test = INSERT INTO test (test, test1, test2, test3) values 
test = test + " " + buildquery; 

のでテストは、私がINNODBとMYISAMで作業することができ、それが32ギガバイトのRAMを搭載した6700KプロセッサーとCentOSのサーバーに取り組んでいます

INSERT INTO test (test, test1, test2, test3) 
    values ("testvalue1", "testvalue2" , "testvalue3" , "testvalue4"), 
      ("testvalue1", "testvalue2" , "testvalue3" , "testvalue4"), 

になります。

したがって、主な質問は次のとおりです。クエリの構築をより迅速にするにはどうすればよいですか。

+0

あなたのPCのハードウェアとクエリの構造によって異なります。ここで詳細を表示 –

+0

@reds私はそれを追加しました。あなたは今それを使って何かをすることができます。 –

+0

アプリをプロファイリングしたとき、どの領域が最も遅いのですか?文字列作成ツールを試しましたか? – BugFinder

答えて

1

最初から正しいサイズに初期化されたStringBuilderを使用することをお勧めします。これにより、すべての文字列のメモリの再割り当てが減少します。 dataToUploadあなたはこれを試すことができますリストであると仮定すると

 // String Builder Initialization 
     // Size is calculated by getting the length of all strings and add 3 for each (','). 
     // Additionally there are 6 chars for " ('" and "')," per array 
     StringBuilder build = new StringBuilder(dataToUpload.Sum(data => data.Sum(s => s.Length) + data.Length * 3) + 6); 

     foreach (string[] st in dataToUpload) 
     { 
      build.Append(" ('" + string.Join<string>("','", st) + "'),"); 
     } 

     buildQuery = build.ToString().TrimEnd(','); 
+0

でなければなりません。私のソリューションよりも速い他のいくつかのソリューションを試しましたが、あなたのソリューションははるかに高速です –

+0

よく聞いてください:-)。私の答えですでに述べたように、最初から文字列のサイズを知っているので、StringBuilderを正しいサイズに初期化できます。これにより、時間のかかるメモリの再割り当てが減少します。 –

+0

私は理由を理解していますが、私は文字列ビルダーに精通していませんでした。以前はこの言葉が聞こえませんでしたが、もっと頻繁に使用する予定です。あなたがデータの合計をこういった方法で完全に割り振ったのはかなりきれいです –

0

ここで必要以上の情報のように感じるが、私はあなたがこのようなinsert文構築していると仮定します[おそらくforeachforをしないための最善の方法は、文字列を置換している、だから、

INSERT INTO MyTable (Column1, Column2) VALUES 
(Value1, Value2), (Value1, Value2) 

を] foreachでは、正しい値を持つ文字列を探します。このような何か:

var count = 0; 
    foreach (string st in dataToUpload) 
      { 
       buildQuery += " ('" + st + "'") " 
       if (count++!=0) 
       buildQuery += "," 

      } 
0

多分これ:

var count = dataToUpload.Count; 
var i = 0; 
foreach (string[] st in dataToUpload) 
{ 
    buildQuery += " ('" + string.Join(",", st) + "')"; 

    if (i++ < count - 1) 
     buildQuery += ","; 
} 

代わりのdataToUploadの内容に目を比較し、それをスピードアップするために、インデックス変数を使用します。 string.Joinは文字列を連結するのに適しています。

+0

これはstring.Joinではstを呼び出し、stは文字列の配列であるため、これはエラーになりません –

+0

@Frits:結合パラメータが間違っています。それは 'string.Join( "'、 '"、st)' –

1

は、あなたのbuildQueryStringているようです。代わりにStringBuilderを試してください。おそらく、文字列の連結を行うための最良の方法です。

+0

トーマスがソリューション全体を投稿しましたが、 –

関連する問題