2013-12-16 31 views
2

我正在做Clojure的數據分析。在此數據分析過程中,我正在與一個SQlite文件進行交互,其中大約有三百兆字節的數據。某些查詢關於此數據集像我在使用Clojure時沒有足夠的空間,我該怎麼辦?

(select crawls)

回報很長的爬行信息的列表。然而,針對大列等查詢給我:

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

我可以用咖喱得到這個與簡單的東西如:

(select authors) 

至於會:

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

有誰知道我該如何解決這個問題?這是我第一個大數據分析項目。

回答

4

查詢應該返回一個惰性結果,以便您可以使用結果而不需要在堆中包含所有內容。如果你從repl中做了一個大的選擇,隱式打印實現了整個lazy seq,所有這一切都在一起去完成,因此堆積如山。

來處理這個正確的方法是寫一個reduce(或者一個map/doseq組合),將在同一時間與一個結果工作,而持有到舊的元素。注意「抓住頭部」,也就是說,不要綁定懶惰seq的頂部元素,否則整個事情將被保存在堆中。

+0

我試過(取10(選擇作者)),我仍然墜毀。根據我的理解,不會意識到整個名單。 – Joshua

+0

'(第一作者)' - 作者是否以嵌套數據結構的方式存儲?您可能需要以懶惰的方式訪問一位作者內部的密鑰。 '(鍵(第一作者))'怎麼樣?另外,當你調試這個問題時,它可能有助於將-Xmx arg提升到jvm:':jvm-opts [「-Xmx4g」]'(或者給出可用物理內存的任何適當的東西)在你的'project.clj '如果使用leinengen(你應該)。 – noisesmith

+0

他們沒有嵌套結構。 =>(首先(選擇故事)) OutOfMemoryError Java堆空間org.sqlite.NativeDB.column_text(NativeDB.java:-2) – Joshua

相關問題