使用Clojure时我的堆空间不足,我该怎么办?

时间:2013-12-16 01:16:50

标签: java sqlite clojure

我在Clojure中进行数据分析。在这个数据分析过程中,我正在与一个SQlite文件进行交互,其中包含大约300兆字节的数据。对此数据集的一些查询,如

(select crawls)

返回很长的抓取信息列表。但是,针对较大列的其他查询给了我:

  

OutOfMemoryError Java堆空间org.sqlite.NativeDB.column_text   (NativeDB.java:-2)

我可以用korma来解决这个问题:

(select authors)

将会:

=> (first (select stories))
OutOfMemoryError Java heap space  org.sqlite.NativeDB.column_text (NativeDB.java:-2)

有谁知道如何解决此问题?这是我的第一个大数据分析项目。

1 个答案:

答案 0 :(得分:4)

查询应返回一个惰性结果,这样您就可以使用结果而无需将所有内容放在堆中。如果你从repl中做了一个大的选择,隐式打印就会一次性实现整个lazy seq,从而耗尽堆。

处理此问题的正确方法是编写reduce(或者可能是map / doseq组合),一次只能处理一个结果而不保留旧元素。注意“抓住头部”,也就是说,不要绑定懒惰seq的顶部元素,否则整个事物将被保存在堆中。