【问题标题】:Parallel sorting of timestamps in F# - the functional way?F# 中时间戳的并行排序 - 功能方式?
【发布时间】:2012-05-26 07:23:56
【问题描述】:

这是我第一次在 F# 中进行 a) 函数式编程 b)。

磁盘上基本上有很多文件(n > 50);每个文件存储仪器的读数和读取该读数的时间的时间戳。问题是要根据时间戳对所有文件中的所有读数进行排序。

注意文件很大。每个文件超过 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”的块,那么在取出下一个块时,File 3: &lt;17:50, XXX&gt; 将是未排序的。为了解决这个问题,打算检查一个块中的最低和最高时间戳值,并测试它们是否位于前一个或后一个块的范围内。

基本上,我仍然在以一种命令式的方式思考(几乎十年的 C 语言就是这样做的)。最近我玩弄了一种生产者-消费者的方法来使用 MailboxProcessor。

来自经验丰富的 F# 程序员,是否有任何“功能性”和更好的方法来使用 F# 并行排序多文件时间戳?

【问题讨论】:

  • “文件很大”。我们正在查看多少 TB 的数据?
  • 大于主内存容量。由某些物理检测器 expt 生成,读数以纳秒为间隔。

标签: f# functional-programming parallel-processing


【解决方案1】:

假设文件不是太大,您可以执行以下操作:

seq {
  for path in files do
    yield! File.ReadAllLines(path)
}
|> Seq.map parseTimestamp
|> Seq.sort

【讨论】:

  • 抱歉忘记指定每个文件都很大。不。条目数 > 10,000。
  • 10.000 是可笑的。只需对每个文件进行排序,然后合并排序的文件。
猜你喜欢
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 2011-06-21
  • 2017-09-08
  • 1970-01-01
  • 2021-11-08
相关资源
最近更新 更多