Scala中的disk-persisted-lazy-cacheable-List™

Hug*_*ira 15 scala data-stream data-structures

我需要在Scala中有一个非常非常长的对(X,Y)列表.如此之大,它不适合内存(但很适合在磁盘上).

  • 所有更新操作都是缺点(头部追加).
  • 所有读取访问都从头部开始,并有序地遍历列表,直到找到预定的对.
  • 缓存会很棒,因为大多数读访问都会反复保留相同的数据.

所以,这基本上是一个"磁盘持久 - 懒惰 - 可缓存列表"™

在我开始推出自己的产品之前,有关如何获得一个的想法吗?


附录:是.. mongodb,或任何其他非可嵌入资源,是一种矫枉过正.如果您对此特定用例感兴趣,请参阅Timeline 此处的课程.基本上,我有一个非常非常大的时间线(几个月内数百万对),虽然我的比赛只需要触及最后几个小时.

Dan*_*ral 4

执行此类操作的最简单方法是扩展Traversable. 您只需定义foreach,并且可以完全控制遍历,因此您可以执行打开和关闭文件之类的操作。

您还可以扩展Iterable,这需要定义iterator,当然还需要返回某种Iterator. 在这种情况下,您可能会Iterator为磁盘数据创建一个,但是控制打开文件之类的事情会困难得多。

下面是我所描述的一个例子Traversable,作者是 Josh Suereth:

class FileLinesTraversable(file: java.io.File) extends Traversable[String] {
  override def foreach[U](f: String => U): Unit = {
     val in = new java.io.BufferedReader(new java.io.FileReader(file))
     try {
       def loop(): Unit = in.readLine match {
          case null => ()
          case line => f(line); loop()
       }
       loop()
     } finally {
       in.close()
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @HugoSFerreira这不是您问题的解决方案,它只是如何扩展“Traversable”以处理内存外集合的示例。 (2认同)