Clojure时间序列分析

4
我有一个大数据集(200GB未压缩,9GB以bz2-9格式压缩),用于股票交易数据。
我想对它们进行一些基本的时间序列分析。
我的机器有16GB内存。
我希望:
- 将所有数据压缩后保留在内存中 - 在流式传输中即时解压数据(不要存到磁盘中) - 在内存中进行所有分析
现在,我认为Clojure的惰性和future对象有很好的交互方式(例如,我可以定义对象,当我试图访问它们时,我会即时解压它们)。
问题:在Clojure中进行高性能时间序列分析时应该注意哪些事项?
我特别关注以下技巧:
- 高效地存储刻度数据 - 高效地进行计算 - 奇怪的卷积来减少数据通行次数
欢迎提供书籍/文章/研究论文建议。(我是CS博士生)
谢谢。
2个回答

3

一些想法:

  • 就存储压缩数据而言,我认为您无法比操作系统自己的文件系统缓存更好。只需确保它配置为使用 11GB+ 的 RAM 用于文件系统缓存,并且在第一次读取时,它应该将整个压缩数据集拉入内存。
  • 然后,您应该能够定义您的Clojure代码通过ZipInputStream懒惰地从数据中提取,它会为您执行解压缩。
  • 如果需要对数据进行第二遍处理,只需在同一文件上创建新的ZipInputStream。操作系统级别的缓存应确保您不会再次访问磁盘。

GZIPInputStream/GZIPOutpuStream可能更加合适。 - BillRobertson42
Apache Commons Compress中有BZip2处理功能。http://commons.apache.org/compress/ - claj

1

我听说过像Java中实现的这样的系统。这是可能的。你肯定想要了解如何创建自己的惰性序列以实现这一点。如果需要确保处理所需的原始类型,我也不会犹豫降级到Java。例如,Clojure不会生成用于32位整数运算的代码,它只会生成用于长整型的代码,如果你不想要那个,那么可能会很麻烦。

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


抱歉问这个愚蠢的问题:Java如何与内存映射文件一起工作?似乎“映射内存结构”和“内存安全性”存在冲突。 - user1647794
请查看此处:http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#map%28java.nio.channels.FileChannel.MapMode,%20long,%20long%29。该方法在Java 1.4中添加,因此已经在JDK中存在了大约10年左右的时间。 :) - BillRobertson42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接