我一直在尋找解決方案,但似乎無法找到任何東西。如何管理在R中生成大數據.tables? (不讀大表)
基本上我有一塊,我正在尋找擴展到大數據的代碼,代碼的樣本提取物是以下:
num_train <- 100
num_test <- 100
train <- data.table(k = rep(1,num_train), ID_train = 1:num_train, b_train = rnorm(num_train), c_train = rnorm(num_train), cat = sample(c("A", "B", "C", "D"), num_train, replace = TRUE))
test <- data.table(k = rep(1,num_test), ID_test = 1:num_test, b_test = rnorm(num_test), c_test = rnorm(num_test))
df <- merge(test,train, by="k")
這將運行正是我希望它速度極快當我在更大的數據上使用它時。 (也許和num_train * num_test = 2,000,000,000 ...一樣大)
但是,問題在於生成的數據表是由num_train * num_test行增長的,所以很快R就無法處理。
num_train <- 1000
num_test <- 10000
train <- data.table(k = rep(1,num_train), ID_train = 1:num_train, b_train = rnorm(num_train), c_train = rnorm(num_train), cat = sample(c("A", "B", "C", "D"), num_train, replace = TRUE))
test <- data.table(k = rep(1,num_test), ID_test = 1:num_test, b_test = rnorm(num_test), c_test = rnorm(num_test))
df <- merge(test,train, by="k")
>Error: cannot allocate vector of size 76.3 Mb
我知道R的所有內存限制和包,如filehash,FF和bigmemory(不是太熟悉,已經使用了一些他們一點點的)。這些似乎允許您將大文件設置爲數據庫並有效地從中讀取數據。
但基本上我想知道的是,有沒有什麼辦法來管理創建從已經在內存中的表中的一個大表,就像它創建時將它的一部分寫入硬盤一樣?這些包中的任何一個都可以用於這個嗎?還有其他解決方案嗎?
或者這項工作只是不適用於R?
乾杯!
弄清楚多少「塊」你可以不超載您的計算機的RAM存儲,然後在一次創建一個塊 - 其追加到FF,bigmemory,或者數據庫支持(SQL)表沒有佔用任何內存空間。然後刪除內存中的當前塊,然後轉到下一個塊。 –
謝謝,這是我現在正在研究的一種方法。爲了我所做的工作,我可以用塊來處理它,但只能處理測試數據集。它需要應用於整個訓練數據集。因此,當訓練數據集大於10,000時,我需要將訓練數據集分成500個以下的行塊並循環,直到處理完所有內容......這種方式否定了data.tables包的速度。 – Ger
好問題。同意安東尼。我做了一個快速計算:'2e9 * 9列* 8字節/ 1024^3 = 134 GB',所以是的,你正在研究你提到的軟件包。除非你可以找到一臺擁有那麼多內存的機器,或者一臺能夠在集羣或其他機器上分配你的內存的虛擬機。這是Revolution爲其提供(封閉源代碼)工具的領域。 –