2017-06-21 40 views
0

可以說我有一個返回數據的函數'getData()'(把它看作是一個數據流)。現在我需要用這些數據組成一個h2o數據框。我需要將它們作爲新行插入,前提是它不存在於數據框中。維護一個h2o數據幀的有效方法

一個明顯的方法就是做:

  1. 有一個全球性的H2O數據幀
  2. 創建一個從到達的數據(1行)一H2O數據幀。 (我用as.h2o())
  3. 檢查,如果它(使用h2o.which()或任何其他功能)
  4. 如果它不存在,然後將其添加到數據在全球數據幀已經存在幀(使用h2o.rbind())

上述解決方案太慢。每次數據到達時(第2步)創建h2o數據幀花費的時間太多。 (僅在小數據集上測試)

我也在考慮將它們存儲在R數據框中,然後在某些間隔後使用h2o.rbind()。

什麼是最好的(時間是優先)的方式來做到這一點?

+2

這篇文章需要一個代碼示例和一些基準。你如何創建H2O框架?創建一個框架不應該花費太多時間 - 步驟2是這裏真正的瓶頸。我懷疑添加另一個創建R data.frame的步驟會降低速度,但這就是爲什麼代碼和基準是真正解決問題的唯一方法。 –

+0

@ErinLeDell我編輯了這個問題。在小數據集(大約增加500行)中,創建h2o數據框似乎需要比搜索和綁定更多的時間。 –

+0

好的,謝謝,現在它更有意義。什麼'getData()'返回一個R行中的1行數據框? –

回答

1

您一定希望儘量減少對as.h2o()的調用,因爲該函數實際上是將數據從R內存寫入磁盤,然後將數據從磁盤讀取到H2O集羣中。這意味着要謹慎使用。但是,加速as.h2o()呼叫的一種方法是在後端使用data.table。如果您安裝了data.table,則可以將以下行添加到代碼的頂部,它將使用而不是as.h2o()內部的utils::write.csv()

library(data.table) 
options("h2o.use.data.table" = TRUE) 

由於要儘量減少as.h2o()電話,它可能會更快存儲在R data.frame幾百或幾千行,然後定期將這些data.frame轉換爲使用as.h2o()的H2OFrame(使用data.table後端),然後掃描H2OFrame的行以查看哪些是新的,然後使用h2o.rbind()將它們添加到「全局」H2OFrame中。

確切知道哪種方法更快的唯一方法是測試數據和計算機上的兩種方法。

相關問題