2016-09-25 34 views
2

我正在努力提高我正在使用的代碼的速度,對於我目前正在使用的項目而言,它是一步一步來的。該項目目前需要初始化10M-1B行和24列之間的任何數據幀以啓動項目。前8列是字符串,接下來的16列是整數,所以它必須是一個數據幀,而不是矩陣,因爲字符串。R - 儘可能快地初始化數據幀

目前我有:

starttime = Sys.time() 
total_num_lineups = 100000000 
lineup = as.data.frame(matrix(nrow = total_num_lineups, ncol = 24)) 

Sys.time() - starttime 
# Time difference of 44.70181 secs 

這大約需要45秒100M行。這個項目可以很好地擴展到1B行,這是我嘗試解決的第一個瓶頸。任何想法如何加快這一步將不勝感激。

extra - 如果需要,我可以提供關於該項目的其他信息,但認爲通過問題聚焦問題可能會更好。如果速度更快,我願意將容器切換到數據表或其他結構。

謝謝!

+0

你是如何得到這個運行的?我得到了'錯誤:無法分配大小爲8.9 Gb的矢量' –

+0

Rich,我認爲這是一個內存問題。處理內存中的對象可以推動特定系統可以處理的限制。上面的代碼我的機器沒有問題。 – jrdnmdhl

+2

你是積極的這一步是必需的? – rawr

回答

3

說到這個大小的東西,data.table包是要走的路。

下面的代碼像你一樣初始化data.frame,但只有1行,將其轉換爲data.table,然後重複第一行到給定的維度。

library(data.table) 

starttime = Sys.time() 
total_num_lineups = 100000000 
lineup = as.data.frame(matrix(nrow = 1, ncol = 24)) 
dt = as.data.table(lineup) 
testit = dt[rep(1,total_num_lineups)] 

Sys.time() - starttime 
# Time difference of 15.08011 secs 

注意,要初始化的data.frame的方式使得所有列雙打,而不是字符/整數你表示你想要的。要獲得所需的色譜柱類型,可以使用以下方法:

library(data.table) 

starttime = Sys.time() 
total_num_lineups = 100000000 
lineup = data.frame(
    character(1), 
    character(1), 
    character(1), 
    character(1), 
    character(1), 
    character(1), 
    character(1), 
    character(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1) 
) 
dt = as.data.table(lineup) 
lineup = dt[rep(1,total_num_lineups)] 

Sys.time() - starttime 
# Time difference of 15.08011 secs 
+0

爲什麼要轉換爲'data.frame'然後轉換爲'data.table'?你可以用'data.table'或'as.data.table'直接創建數據,或者甚至通過'setDT(lineup)'將'data.frame'轉換爲'data.table' *。另外,在這裏我沒有看到'data.table'與'data.frame'性能的比較。另外,也許在矩陣中做'dt [rep(1,total_num_lineups)]]會比兩者快。總而言之,只是說「* data.table是要走的路!*」並不足以證明IMO。 –