最近、F#で似たようなものを試しました。私は、スペースで区切られたファイル内の問題のシンボルの1分のバー形式から始めました。このファイルには、約80,000の1分のバーの読み取り値があります。ディスクからロードして解析するコードは1ミリ秒未満でした。ファイル内のすべての期間の100分のSMAを計算するコードは530msでした。1ms未満で計算されると、SMAシーケンスから必要なスライスをプルできます。私はF#を学んでいるだけなので、おそらく最適化する方法があります。これは複数のテスト実行後のものであるため、すでにWindowsキャッシュにありますが、ディスクからロードされた場合でも、ロードに15ミリ秒を超えることはありません。
日付、時刻、オープン、高、低、クローズ、ボリューム01/03 / 2011,08:00:00,94.38,94.38,93.66,93.66,3800
再計算時間を短縮するために、計算されたインジケーターシーケンス全体を\ n区切り文字を使用して単一のファイルでディスクに保存します。通常、Windowsファイルキャッシュにある場合、ロードと解析にかかる時間は0.5ミリ秒未満です。完全な時系列データ全体にわたる単純な反復により、1年間の1分バーを使用して、3ミリ秒未満の操作で日付範囲内のレコードのセットを返します。また、データ量が少ないため、ロードがさらに高速になる別のファイルに日次バーを保持しています。
.net4 System.Runtime.Cachingレイヤーを使用して、事前に計算されたシリーズのシリアル化された表現をキャッシュし、キャッシュ専用のRAMを数ギガ使用すると、ほぼ100%のキャッシュヒット率が得られるため、事前に計算されたインジケーターにアクセスできますシンボルに設定すると、通常1ミリ秒未満で実行されます。
インジケーターから必要なデータのスライスを取得するのは通常1ミリ秒未満であるため、高度なクエリは単純に意味がありません。この戦略を使用すると、20ミリ秒未満で10年間の1分のバーを簡単にロードできました。
// Parse a \n delimited file into RAM then
// then split each line on space to into a
// array of tokens. Return the entire array
// as string[][]
let readSpaceDelimFile fname =
System.IO.File.ReadAllLines(fname)
|> Array.map (fun line -> line.Split [|' '|])
// Based on a two dimensional array
// pull out a single column for bar
// close and convert every value
// for every row to a float
// and return the array of floats.
let GetArrClose(tarr : string[][]) =
[| for aLine in tarr do
//printfn "aLine=%A" aLine
let closep = float(aLine.[5])
yield closep
|]