2012-06-15 42 views
36

R似乎真的是專門用來處理可以完全放入內存的數據集。推薦使用什麼R包進行信號處理和在非常大的數據集上進行機器學習,這些數據集不能被拉入內存?推薦用於在R中進行超大型數據集處理和機器學習的軟件包

如果R是根本錯誤的方式做到這一點,我願意接受其他強大的免費的建議(如SciPy的,如果有處理非常大的數據集,一些不錯的方式)

+10

查看[高性能計算任務視圖](http://cran.r-project.org/web/views/HighPerformanceComputing.html)中的「大內存和內存不足數據」部分,在CRAN上。 [bigmemory](http://cran.r-project.org/web/packages/bigmemory/index.html)和[ff](http://cran.r-project.org/web/packages/ff/index .html)是兩個流行的軟件包。另外,考慮將數據存儲在數據庫中並讀取較小的批次以供分析。 – jthetzel

回答

28

查看CRAN上​​的「大內存和內存不足數據」部分。 bigmemoryff是兩個流行的軟件包。對於大內存(以及相關的biganalyticsbigtabulate),bigmemory website有幾個非常好的演示文稿,短片和Jay Emerson的概述。對於ff,我建議您閱讀AdlerOehlschlägel及其同事在ff website上的精彩幻燈片演示。

另外,考慮將數據存儲在數據庫中,並讀取較小的批次進行分析。可能有很多方法需要考慮。首先,請查看biglm包中的一些示例以及Thomas Lumley的this presentation

並且在高性能計算任務視圖中調查其他軟件包,並在其他答案中提及。上面提到的軟件包只是我碰巧擁有更多經驗的軟件包。

+1

結束了使用BigMemory,我通常很滿意它。 –

+1

但是使用ff,bigmemory或數據庫......你能否直接執行R或任何包提供的任何操作?或者你只能運行ff,bigmemory或數據庫引擎已經實現的功能? (不需要打破小件數據)。例如,我想對50GB數字文件運行迴歸或計算中位數。或者我想要應用DBScan,或者只是想創建另一個向量,其中每個元素都表示爲一些舊的BB [i] = AA [i] * AA [i-1] + AA [i-2]的操作。我可以用R和ff,bigmemory或任何數據庫連接器來做到這一點嗎? – skan

8

我認爲數據量即可程序比其他任何程序更受限於編程技能。雖然許多標準功能都集中在內存分析上,但將數據分割成塊已經有很大幫助。當然,這比編寫標準R代碼花費更多的時間進行編程,但通常這很有可能。

可以使用read.table或readBin完成數據的切割,只支持讀取數據的一個子集。或者,您可以查看高性能計算任務視圖,瞭解可以提供即用即用的內存不足功能的軟件包。您也可以將數據放入數據庫中。對於空間柵格數據,優秀的柵格包提供了內存不足分析。

8

對於機器學習任務,我可以推薦使用biglm軟件包,用於「迴歸數據太大而不適合內存」。對於使用真正大數據的R,可以使用Hadoop作爲後端,然後使用包rmr通過Hadoop集羣上的MapReduce執行統計(或其他)分析。

7

這一切都取決於你需要的算法。如果它們可能被翻譯成增量形式(當在任何給定時刻只需要一小部分數據,例如,對於樸素貝葉斯,只能記憶模型本身和正在處理的當前觀察),那麼最好的建議是逐步執行機器學習,從磁盤讀取新批次的數據。

但是,許多算法,尤其是它們的實現都需要整個數據集。如果數據集大小適合磁盤(和文件系統限制),則可以使用允許將磁盤上的文件映射到內存並在程序中使用的軟件包。但是請注意,對磁盤的讀寫操作很昂貴,而R有時喜歡頻繁地來回移動數據。所以要小心。

如果您的數據即使在您的硬盤上也無法存儲,您將需要使用分佈式機器學習系統。一個這樣的基於R的系統是Revolution R,它被設計爲handle非常大的數據集。不幸的是,它不是開源的,花了不少錢,但你可能試着得到free academic license。作爲替代方案,您可能對基於Java的Apache Mahout感興趣 - 不是那麼優雅,但非常有效的解決方案,基於Hadoop幷包含許多重要的算法。

+1

使用Revolution R,您可以在大型數據集上應用某些功能,但只能使用Revoscaler軟件包上實現的功能。您沒有在大型數據集上使用任何R函數或程序包的通用方法。例如,如果您想運行DBSCAN集羣,則需要使用revoscaler(或類似軟件包)提供的基本功能來重寫整個方法。 – skan

3

如果內存不夠用,一種解決方案是將數據推送到磁盤並使用分佈式計算。我認爲RHadoop(R + Hadoop)可能是應對大量數據集的解決方案之一。