12

データベースが複数のリスト間で行うのと同じように、CROSS Join を処理するために、この Linq を作成しました。

しかし、何らかの理由で、いずれかのリストが 3000 を超えると非常に遅くなります。30 秒待つのですか? これらのリストは非常に多くなる可能性があります。

このクエリは、 ColumnDataIndexから取得された他のリストのデータとの関係ごとにループされます。

何かアドバイス ?

UPDATE ** - データは、構成されたソースから事前に作成された通常のリストに挿入されます。これは現時点ですべての記憶にあります。

RunningResult[parameter.Uid] = (from source_row in RunningResult[parameter.Uid]
                            from target_row in ColumnDataIndex[dest_key]
                            where GetColumnFromUID(source_row, rel.SourceColumn) == GetColumnFromUID(target_row, rel.TargetColumn)
                            select new Row()
                            {
                                Columns = MergeColumns(source_row.Columns, target_row.Columns)

                            }).ToList();

2 つの追加機能:

MergeColumns : 2 つの項目から列を取得し、それらを 1 つの配列にマージします。

public static Columnn[] MergeColumns(Column[] source_columns, Column[] target_columns)
{
      Provider.Data.BucketColumn[] new_column = new Provider.Data.BucketColumn[source_columns.Length + target_columns.Length];
      source_columns.CopyTo(new_column, 0);
      target_columns.CopyTo(new_column, source_columns.Length);
      return new_column;
  }

GetColumnFromUID : 指定された列 uid に一致するアイテム内の列の値を返します。

private static String GetColumnFromUID(Row row, String column_uid)
  {
       if (row != null)
       {
           var dest_col = row.Columns.FirstOrDefault(col => col.ColumnUid == column_uid);
           return dest_col == null ? "" + row.RowId : dest_col.Value.ToString().ToLower();
       }
       else return String.Empty;

  }

アップデート:

データとクエリをデータベースに移動することになりました。これにより、速度がミリ秒に低下しました。最適化されたループ関数を作成することもできましたが、これが私にとって最速の方法でした。

4

2 に答える 2

4

実際にクロス結合を実行する必要はありません。 クロス結合は、本質的にコストのかかる操作です。 本当に必要でない限り、それを行うべきではありません。あなたの場合、本当に必要なのは単なる内部結合です。クロス結合を実行すると、まったく必要のない多くの値が生成されます。次に、それらの値の大部分を除外して、必要な値をいくつか残します。最初から内部結合を行った場合は、必要な値のみを計算します。これにより、必要のない行を大量に作成して破棄する必要がなくなります。

LINQ には独自の内部結合操作 がJoinあるため、独自に記述する必要さえありません。

RunningResult[parameter.Uid] = (from source_row in RunningResult[parameter.Uid]
                                join target_row in ColumnDataIndex[dest_key]
                                on GetColumnFromUID(source_row, rel.SourceColumn) equals
                                    GetColumnFromUID(target_row, rel.TargetColumn)
                                select new Row()
                                {
                                    Columns = MergeColumns(source_row.Columns, target_row.Columns)

                                }).ToList();
于 2013-03-12T17:41:46.527 に答える
0

クロス結合を行っているのではなく、ON 句を使用した内部結合を行っています。あなたの場合のみ、where 述語の ON 句です。

通常、内部結合は 2 つのハッシュ セット/テーブルで行われるため、行 Y の値に基づいてセット X の行をすばやく見つけることができます。

したがって、「ウェストンの答えは問題ありませんが、辞書/ハッシュテーブルを使用して非常に高速にする必要があります。キーごとにより多くの行が存在する可能性があることに注意してください。そのために、次のような複数値のハッシュテーブル/辞書を使用できます

于 2013-03-12T17:22:13.507 に答える