4

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

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

我的机器有 16GB 的 RAM。

我宁愿:

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

  • 即时解压缩该数据,并将其流式传输[所以没有任何东西会命中磁盘]

  • 在内存中进行所有分析

现在,我认为这与 Clojure 的惰性和未来对象之间存在很好的交互(即,当我尝试访问它们时,我可以定义对象 st,我会即时解压缩它们。)

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

我对涉及的技巧特别感兴趣:

  • 有效地将分时数据存储在内存中

  • 高效地进行计算

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

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

谢谢。

4

2 回答 2

3

一些想法:

  • 在存储压缩数据方面,我认为您不会比操作系统自己的文件系统缓存做得更好。只需确保将其配置为使用 11GB 以上的 RAM 进行文件系统缓存,并且它应该在第一次读取时将整个压缩数据集拉入内存。
  • 然后,您应该能够定义您的 Clojure 代码以通过ZipInputStream懒惰地拉入数据,这将为您执行解压缩。
  • 如果您需要对数据执行第二次传递,只需在同一文件上创建一个新的 ZipInputStream。操作系统级别的缓存应确保您不会再次访问磁盘。
于 2012-09-10T23:18:45.317 回答
1

我听说过类似用 Java 实现的系统。有可能的。您肯定会想了解如何创建自己的惰性序列以完成此操作。如果您需要确保处理的是您想要处理的原始类型,我也会毫不犹豫地使用 Java。例如,Clojure 不会生成代码来对 32 位整数进行数学运算,它只会生成处理 long 的代码,如果您不希望这样做可能会很痛苦。

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

于 2012-09-11T02:22:32.503 回答