2012-11-01 54 views
2

我正在使用我從Oracle數據庫下載的非常大的數據集。數據框有大約21百萬行和15列。 我的操作系統是Windows XP(32位),我有2GB內存。短期而言,我無法升級我的內存或操作系統(它在工作中,需要幾個月的時間才能獲得體面的電腦)。在R中使用非常大的數據集

library(RODBC) 
sqlQuery(Channel1,"Select * from table1",stringsAsFactor=FALSE) 

我在這裏已經與通常的「無法分配xMb到矢量」卡住了。 我發現了一些關於使用ff軟件包的建議。我希望知道是否有人熟悉ff軟件包可以告訴我這是否對我有幫助。 你知道解決內存問題的另一種方法嗎? 64位解決方案有幫助嗎? 感謝您的建議。

+0

可如果數據架構允許你可以把表中的hbase或hadoop在csv格式,並嘗試R在地圖減少時尚?看到Rhadoop – FUD

+6

以每小時2美元的價格從亞馬遜租一臺電腦,[這些好人](http://www.bioconductor.org/help/bioconductor-cloud-ami/)爲你設置了所有的工作。 – Chase

回答

3

如果您正在使用包ff並使用SQL獲取數據,則可以使用包ETLUtils輕鬆獲取它們,請參閱文檔以獲取使用ROracle時的示例。根據我的經驗,ff非常適合您正在使用的數據集類型(21 Mio行和15列) - 事實上,您的設置對ff來說很小,除非您的列包含大量字符數據,將被轉換爲因素(意味着你的所有因素水平應該能夠適應你的RAM)。 軟件包ETLUtils,ff和包ffbase允許您使用ff獲取R中的數據並對其進行一些基本統計。根據您的數據和硬件的處理方式,您可能需要在構建模型時考慮採樣。我更喜歡在R中使用我的數據,基於樣本構建模型並使用ff中的工具(如分塊)或從ffbase包中創建分數。

的缺點是,你必須習慣這樣的事實:你的數據ffdf對象和可能需要一些時間 - 特別是如果你是新的R.

+0

非常感謝您的評論,這非常有幫助。正如你所建議的,我使用包* ETLUtils *來從數據庫下載* ffdf *中的數據,但是我在特定時間點出現了以下錯誤消息:*「UseMethod(」recodeLevels「)中的錯誤: ('integer','numeric')「*。對象上的'recodeLevels'的適用方法我使用:* read.odbc.ffdf(query = query,odbcConnect.args = list(dsn =」dbs「 ,uid =「」,pwd =「」), first.rows = 100,next.rows = 1000,VERBOSE = TRUE)*。您有任何建議嗎? – ddg

+0

如果沒有更多與您的具體信息相關的信息數據,但它看起來像你的列之一是從數字到字符/因子,反之亦然,從一個塊到另一個塊。我的建議是檢查你的數據,看看發生了什麼,並使用參數transFUN,如果需要,以確保它始終保持相同的R數據類型 – jwijffels

+0

事實上,正如你所說,有一列wh ich有時包含數字有時字母。我將參數* next.rows *修改爲* 500'000 *。它實際上解決了這個問題(沒有更多的錯誤消息),並加速了整個過程(數據下載時間從6小時到50分鐘)。不過,我會對如何使用* transFUN *感興趣嗎?您能指出任何示例嗎?你會如何在這種情況下使用?提前致謝。 – ddg

2

對不起,我對ff沒有幫助,但關於RAM的話題:我不熟悉R數據幀的內存使用情況,但爲了說明起見,我們假設每個單元需要8個字節(例如雙精度浮點數或長整數)。

2100萬* 15 * 8字節=大約2.5GB。

更新並參閱下面的評論;這個數字可能是低估了!

所以你可以真正用更多的RAM,而64位機器將會有很大的幫助,因爲32位機器被限制在4GB(並且不能完全使用它)。

值得嘗試一下數據集的一個子集,這樣你就知道你可以用現有的RAM加載多少,然後外推估計你實際需要多少。如果您可以細分數據並以大塊方式處理數據,那會很好,但很多問題不容易提交。

此外,我一直假設你需要所有的列!很顯然,如果您可以通過任何方式過濾數據以減小數據大小(例如刪除任何不相關的列),那麼可能會有很大幫助!

+0

通常引用的粗略經驗法則是,除了將內存加載到R中的內存中,您需要將對象的大小減去內存大小的3倍(R可以進行大量複製)。 – joran

+0

數據幀大約會增加80-100%的開銷(由於先進的索引,我想),所以你可以估計你的估計內存。爲了節省內存,您可以使用幾乎爲零開銷的矩陣。 – ffriend

+0

感謝您的詳細信息 - 因此,除非可以使用完全不同的(以磁盤爲中心的)處理模型,否則將我的估計數乘以2或3會強化對更多RAM的需求(並使64位基本必不可少),或者虛擬內存/內存映射是可以容忍的。 – DNA

1

還有另外一個非常類似的question。特別是,處理數據的一種方法是將其寫入文件,然後將內存區域映射到該文件(例如,請參閱mmap程序包)。

+0

雖然這是正確的,但數據已經在數據庫服務器上存檔。除非數據庫服務器(或連接)速度很慢,否則我沒有看到太多優勢。 –

+0

@JoshuaUlrich:情況並非總是如此,您可能會連接到遠程數據庫。同樣使用RDMS意味着使用SQL,並且最可能歸結爲將數據分割成塊,這並非總是可行。無論如何,我給出的答案在我看來最容易實現,並且如果這個答案不符合TC的需求,也可以鏈接到其他一些很好的答案。 – ffriend

3

根據我的經驗,處理大塊數據幾乎總是可以幫助處理大數據。例如,如果計算時間平均值,則在任何給定時間只需要一次時間步進。您已經將數據存儲在數據庫中,因此獲取子集很容易。或者,如果您無法輕鬆處理大塊數據,則可以隨時嘗試並獲取數據的一部分。重複分析幾次,看看你的結果是否對你選擇的子集敏感。底線是,一些聰明的想法可以讓你用2G的RAM獲得很長的路。如果您需要更具體的建議,則需要提出更具體的問題。

+0

還有'colbycol'軟件包支持逐列處理。 –

相關問題