2017-05-16 12 views
0

私は列のストリームに格納されたデータに基づいて塗りつぶす必要があるオブジェクトを持っています。つまり、ストリームには最初にDataTableのスキーマが含まれています。現時点ではC#DataTableに列に格納されたデータを入力する最も速い方法は何ですか?

、私はすべてデータ値を保持するのに十分な空の行を作成します

  • のではなく単純なアプローチを取っています。
  • セルごとにこれらの行を入力します。

結果は、セルごとの繰り返しです。これは、特に言い表せません。

です:

// Create rows first... 
// Then populate... 
foreach (var col in table.Columns.Cast<DataColumn>) 
{ 
    List<object> values = GetValuesfromStream(theStream); 

    // Actual method has some DBNull checking here, but should 
    // be immaterial to any solution. 
    for (var i=0; i<values.Count; i++) 
     table.Rows[i][col] = values[i]; 
} 

私の推測では、各列のDataStorage項目は行が追加されるように拡大されていないが、値が各列に追加されると、私はこれまで、特定のからだバッキングです。この種のデータを読み込むためのヒント。

NBまず、すべてのリストを最初にロードし、次に行単位で読み込むことは、おそらく分かりません。この方法は、巨大なDataTableオブジェクトをシリアル化するときに発生する可能性のあるメモリ不足の可能性を軽減するために、データグリッド全体のクローンを作成し、それを読み込むだけでおそらく問題が他の場所に移ります。元のテーブルと別の値の列には十分なメモリがありますが、DataTableのコピーが2つあるとは限りません。

+0

移調している場合は、セル単位で作業する必要性を避けることができないことがわかります。/// –

+0

そのため、当面はセル単位で操作しています。どこかに隠されているより速いルート。私の推測では、基になる 'DataStorage'オブジェクトにアクセスしてそこの配列に直接コピーする必要がありますが、行には本質的にそれらの配列に対するインデックスであるIDが付いているため、あれは。 – tobriand

+0

だから、最初のコメントは、テーブルごとに 'List 'を作成し、それを記入してから、 'table.Rows'に直接アクセスするのではなく、テーブルに追加してください。これにより、ヌル値を受け入れることができない列や、式が含まれている箇所の問題を回避できます。多くの減速の結果、この問題は、何か他のものよりも表現の再計算や 'DataTable'イベントモデルのように思えます。 – tobriand

答えて

0

上記のコメントのように、セルの反復を避ける方法は見つけられませんでしたが、すでにテーブルに追加されているDataRowアイテムに書き込むことは悪い考えです。私が観察した減速の大部分を占めていました。あなたがnullであり、テーブルに空DataRowを追加しようと

  1. List<DataRow> rows = null; 
    // Start population... 
    var cols = table.Columns.Cast<DataColumn>.Where(c => string.IsNullOrEmpty(c.Expression)); 
    foreach (var col in cols) 
    { 
        List<object> values = GetValuesfromStream(theStream); 
        // Create rows first if required. 
        if (rows == null) 
        { 
         rows = new List<DataRow>(); 
         for (var i=0; i<values.Count; i++) 
          rows.Add(table.NewRow()); 
        } 
        // Actual method has some DBNull checking here, but should 
        // be immaterial to any solution. 
        for (var i=0; i<values.Count; i++) 
         rows[i][col] = values[i]; 
    } 
    rows.ForEach(r => table.Rows.Add(r)); 
    

    このアプローチは、2つの問題に対処します。

    は、私が使用される最終的なアプローチは、このような何かを探してしまいました制限などがある場合は、エラーが発生します。この方法では、追加する前にすべてのデータが確実に保持されますが、このような問題のほとんどは解決されています(自動インクリメントのPKカラムの動作を確認する必要はありませんでした)。

  2. 式は、表に追加された行の行状態が変更されたときに評価されます。結果として、値がセルに追加されるたびに(高価で無意味な)すべての式が再計算される前は、すべての基本データが追加された後にすべての計算がただちに行われます。

はもちろん、私が利用していますテーブルはDataTableクラス/モデルのこれらの機能を使用していないので、私はまだ遭遇していませんでしたテーブルへの書き込みと他の合併症があるかもしれません。しかし、単純なケースでは、これはうまくいきます。

関連する問題