0

いくつかの「データ ソース」があり、それぞれが順序付けられたタイムスタンプ付きデータを提供します。それを単一の順序付けられたストリーム (マージソートなど) にフラット化したいと思います。この回答は、2 つの列挙型に対してそれを行う方法を説明していますが、それを一般化する方法がわかりません。

データ ソースは膨大なため、メモリ内では実行できず、ストリーミングする必要があります。

例で説明すると、次のようなものがあります。

interface IDataSource
{
    IEnumerable<DateTime> GetOrderedRecords();
}

次のような拡張メソッドを使用できるようにしたいと思います。

// get all sources
IEnumerable<IDataSource> dataSources = GetAllSources();

// merge sort
IEnumerable<DateTime> flattened = dataSources
    .MergeSort(s => s.GetOrderedRecords());

[編集]

すべてを熱心に読み込んで並べ替えることができない理由は、複数のデータベースからデータを読み込んで別のデータベースにエクスポートしているためです。それぞれIDataSourceは基本的に、Linq から NHibernate への内部処理であり、何百万ものデータ行を返す必要があります。

だから私が必要とするのは次のようなものです:

  1. 利用可能なすべてのソースから、次のタイムスタンプをロードします。
  2. ディスクに保存して「忘れて」ください。

データ ソースは既にソートされているため、"マージ ソート" アプローチが実行可能になります。

4

1 に答える 1

2

あなたができる簡単なことの1つは、Mergeリンクした質問から実装への呼び出しを連結することです:

public static IEnumerable<DateTime> Merge(this IEnumerable<IDataSource> dataSources)
{
    var result = Enumerable.Empty<DateTime>();

    foreach(var dataSource in dataSources)
    {
        result = result.Merge(dataSource.GetOrderedRecords(), (x, y) => x < y);
    }

    return result;
}

次のように呼び出します。

var result = dataSources.Merge();

MoveNextこれには、返された列挙型の列挙子を呼び出すたびに、ネストされた列挙型に対して非常に多くの MoveNext 呼び出しが発生するという欠点があります。

于 2012-10-10T10:16:52.407 に答える