2

過去の株式データのビッグデータファイルがあり、C#GUIを介してロードしてから、F#でさまざまなアルゴリズムを使用して処理したいと考えています。追加の値は、時間の経過とともにリストに追加されます。

リストは2次元であり、形式は

[[id, Open,High,Low,Close], [id, Open,High,Low,Close], ...]

F#コードはライブラリにあり、C#リストでは機能しません(F#でリストの2番目の次元の値を取得できません)。F#操作が行われるたびにリスト全体を変換するのはコストがかかりすぎます。C#は値を処理できないため、値をF#リストに格納することもできません。

提案されたソリューションは次のとおりです。

  1. ライブラリは値を格納できないため、ストレージの目的でF#リストをC#に格納し、同じ値を含むC#リストとともに、必要に応じてリストの一部を変換します。ここでの主な問題は、ファイルのサイズが数GBになる可能性があることです。

  2. F#のファイルから直接必要な値を読み取り、計算された値を追加のファイルに保存します。ここでの問題は、ファイルの効率的な編成であり、ロードする行の選択(移動平均計算など)をすばやく実行できます。

4

2 に答える 2

3

内部シーケンスはリストである必要がありますか?常に同じ要素(OHLC)がある場合は、固定された性質を明示するため、タプル(またはカスタムタイプ)を使用することをお勧めします。私はおそらくこのようなことをするでしょう:

module Stock =
  let (!) s = DateTime.Parse(s)

  let getOHLC() : unit -> seq<DateTime * float * float * float * float> =
    seq [
      !"18-Dec-12",27.25,27.63,27.14,27.56
      !"17-Dec-12",26.79,27.22,26.68,27.10
      !"14-Dec-12",27.11,27.13,26.70,26.81
      //...
    ]

本当に各要素をリストにする必要がある場合は、それをパイプでつなぐことができますSeq.map seq

seq関数は次のように定義されます。

let seq (x:seq<'T>) = x

したがって、コピーではなく、アップキャストするだけです。

于 2012-12-19T15:17:49.453 に答える
1

F#操作が行われるたびにリスト全体を変換するのはコストがかかりすぎます。

あなたはそれを測定しましたか?

C#は値を処理できないため、値をF#リストに格納することもできません。

F#リストの要素はC#から列挙できるはずです。これは、列挙可能なものにすぎないためです。

C#の型は、F#にSystem.Generics.List<System.Generics.List<Double>>渡されます。IEnumerableリスト値の変換を呼び出しているのではなく、すべての要素をOfSeq()呼び出しOfSeq()てリスト全体をループし、それを複製する必要があります。

のようなものを呼び出すとArray.ofSeq、新しいコレクションが作成されますが、コンテンツを反復処理するためにそれを行う必要はありません。

指定したタイプのF#名は。であることに注意してくださいResizeArray<ResizeArray<float>>

たとえば、次のことができます。

let f (xss: ResizeArray<ResizeArray<float>>) =
  for xs in xss do
    for x in xs do
      printfn "%A" x

コピーせずにF#からデータを消費します。

于 2012-12-22T23:31:14.117 に答える