Clojure时间序列分析

时间:2012-09-10 22:39:57

标签: performance clojure

我有一个大型数据集(200GB未压缩,9GB压缩,bz2 -9)的股票价格数据。

我想对它们进行一些基本的时间序列分析。

我的机器有16GB的RAM。

我更愿意:

  • 将所有数据压缩在内存中

  • 动态解压缩该数据,并将其流式传输[因此没有任何内容可以访问磁盘]

  • 在内存中进行所有分析

现在,我认为这里与Clojure的懒惰和未来的对象有很好的互动(即我可以在尝试访问它们时定义对象,我会动态解压缩它们。)

问题:在Clojure中进行高性能时间序列分析时,我应该记住哪些事项?

我特别感兴趣的是:

  • 有效地将记录数据存储在内存中

  • 有效地进行计算

  • 减少数据传递次数的奇怪卷积

书籍/文章/研究论文建议表示欢迎。 (我是CS博士生。)

感谢。

2 个答案:

答案 0 :(得分:3)

一些想法:

  • 在存储压缩数据方面,我认为您不会比操作系统自己的文件系统缓存做得更好。只需确保它配置为使用11GB + RAM进行文件系统缓存,它应该将您的整个压缩数据集拉入内存,因为它是第一次读取。
  • 然后,您应该能够定义您的Clojure代码,通过ZipInputStream延迟拉入数据,这将为您执行解压缩。
  • 如果您需要对数据执行第二次传递,只需在同一文件上创建一个新的ZipInputStream。操作系统级别缓存应确保您不再次访问磁盘。

答案 1 :(得分:1)

我听说过用Java实现的系统。有可能的。您当然希望了解如何创建自己的延迟序列以实现此目的。如果你需要确保处理你想要处理的原始类型,我也会毫不犹豫地下载到Java中。例如Clojure不会生成用于在32位整数上进行数学运算的代码,它只会生成用于long的代码,如果你不想要它可能会很麻烦。

使内存格式与磁盘格式兼容也值得一些努力。这将为您提供内存映射文件的选项,或者(至少)使您的启动容易,如果您的程序崩溃。例如它可以只读取磁盘上的文件以恢复其先前的状态。