3

これは、a) 関数型プログラミング b) F# で行うのは初めてです。

基本的に、ディスクには多数のファイルがあります (n > 50)。各ファイルには、測定器の測定値と、その測定値が取得された時刻のタイムスタンプが保存されます。問題は、タイムスタンプに基づいてソートされたすべてのファイルのすべての読み取り値を取得することです。

NBファイルは巨大です。ファイルごとに 10,000 を超えるエントリ。

File 1: <12:00, XXX> ; <15:30, XXX> ; <18:20, XXX> ;

File 2: <10:45, XXX> ; <16:20, XXX> ; <16:55, XXX> ;

File 3: <17:50, XXX> ;

最初の n00b は、N 個のチャンク内のすべてのファイルのすべてのエントリを取得し、F# の組み込みの並べ替え機能の 1 つを使用することです。各ファイルから「1」のチャンクで物事を取得するとFile 3: <17:50, XXX>、次のチャンクが取得されたときにソートされません。これに対処するには、チャンク内の最小および最大のタイムスタンプ値をチェックし、それらが前または後続のチャンクの範囲内にあるかどうかをテストします。

基本的に、私はまだ命令的な方法で考えています (ほぼ 10 年間の C でそうしています)。最近、MailboxProcessor を使用するための生産者と消費者のアプローチを試してみました。

経験豊富な F# プログラマから、F# を使用して複数ファイルのタイムスタンプを並列に並べ替える「機能的」でより良い方法はありますか?

4

1 に答える 1

1

ファイルが大きすぎないと仮定すると、次のようなことができます。

seq {
  for path in files do
    yield! File.ReadAllLines(path)
}
|> Seq.map parseTimestamp
|> Seq.sort
于 2012-05-27T03:05:12.317 に答える