2012-03-17 10 views
0

タイトルと同じことをするコードを記述しました。問題は、プロセス全体が1000レコード分で10分かかったことです。 (vb.net 3.5とSQL Server CEで書かれた)xmlテーブルのデータを取得するためのパフォーマンスの最適化

私は、パフォーマンスを向上させるために、このコードを最適化するにはどうすればよい
MyConnection.Open() 
Dim count As UInt32 
cmnd = New SqlCeCommand(sqlstring, MyConnection) 
cmnd.CommandType = CommandType.TableDirect 
myreader = cmnd.ExecuteResultSet(ResultSetOptions.Scrollable Or ResultSetOptions.Updatable) 
myreader.ReadLast() 
myreader.Read() 
Dim i As UInt16 
Do Until _TableItem(count) Is Nothing 
    record = myreader.CreateRecord() 
    For i = 0 To 20 
     record.SetString(i, _TableItem(count + i).value()) 
    Next 
    myreader.Insert(record) 
    count += 21 
Loop 
MyConnection.Close() 

:ここでは、コードのですか?

ありがとうございました。

+0

likley _TableItem関数は、データベースからカウントを読み取ります...この関数のソースを質問に追加することを検討してください。 –

+0

_TableItemは抽出するタグの位置をマークし、innerTextは子データを抽出しますが、データ全体をダウンロードしてstringbuilder関数でジョブを実行することがありましたが、どうすればそれを行うことができますか?また、countは整数です – lkn2993

+0

私は値の関数は、文字列として子供の内側のテキストを抽出することを意味、私の悪い。 – lkn2993

答えて

0

私は自分でそれを理解しましたが、同じ問題に固執している他の人たちにこの質問に答えています。

実際には、doループとforループではなく、それぞれforとselect case(c#switch)文を使用するという解決策があります。コードは次のようになります。

For Each child as _TableItemChildNode in _TableItem 
    Select Case count 
     case 0 
      record = myreader.CreateRecord() 
      record.SetString(count, child.value()) 
      count += 1 
     case 1 to 19 
      record.SetString(count, child.value()) 
      count += 1 
     case 20 
      record.SetString(count, child.value()) 
      myreader.Insert(record) 
      count = 0 
    End Select 
Next 

コードの変更だけで7分の時間が節約されました。項目内のレコードが非常に大きいため、処理にはデフォルトで時間がかかることに注意してください。

0

長時間かかることを測定して調べる必要があります。 1000アイテムの10分は非常に長い時間なので、問題を見つけるのは簡単です。 Stopwatchクラスの使用はそのような測定のためのものです。

最初に、あなたのコードが1-10-100-1000レコードのレコード数のレニアであるかどうかを確認してください。私はあなたが時間の非線形成長を見つけることを期待しています(少なくともO(n^2))。

「レコード」オブジェクトの作成は、データをデータベースに送信することとは別に、つまりmyReader.Insert()を単純に削除することによって行われます。

+0

非常に奇妙なことに、挿入機能を削除すると、プロセス全体でゼロ(秒!これは挿入機能自体が非常に軽いことを意味します。 – lkn2993

+0

最も時間のかかる行は、valueプロパティにアクセスする行です。プロパティを定数文字列で置き換えると、7.5分(10のうち)が保存されます。今のところ、配列プロパティを値などのようにキャッシュしています(_TableItem配列自体に時間がかからないことに注意してください)。 – lkn2993

+0

私のSqlCeBulkCopyライブラリを試すことができます... http://sqlcebulkcopy.codeplex.com – ErikEJ

関連する問題