2016-01-09 6 views
0

Я работаю с очень большим набором данных, и я хотел бы сохранить данные в H2O как можно больше, не доводя его в R.Передача H2O Frames по ссылке

я заметил, когда я передать H2O Frame к функции , любая модификация, которую я делаю в рамке, не отражается вне функции. Есть ли способ передать кадр по ссылке?

Если нет, то каким образом можно изменить исходный кадр внутри функции с копированием всего кадра?

Другой связанный с этим вопрос: передает ли кадр другим функциям (только для чтения), сделайте дополнительные копии на стороне H2O? Мои наборы данных - 30 ГБ - 100 ГБ. Поэтому, чтобы убедиться, что их передача не вызывает проблем с памятью.

mod = function(fdx) { 
    fdx[,"x"] = -1 
} 

d = data.frame(x = rnorm(100),y=rnorm(100)) 
dx = as.h2o(d) 
dx[1,] 
mod(dx) 
dx[1,] # does not change the original value of x 


> dx[1,] 
      x   y 
1 0.3114706 0.9523058 

> dx[1,] 
      x   y 
1 0.3114706 0.9523058 

Спасибо!

+0

'data.table' имеет аналогичный механизм для использования' reference', но я не уверен, что он может использоваться в вашем случае. вы можете посмотреть [здесь] (http://stackoverflow.com/questions/10225098/understanding-exactly-when-a-data-table-is-a-reference-to-vs-a-copy-of-another). – Patric

ответ

2

H2O делает классическую оптимизацию копирования на запись. Таким образом:

  • Настоящая копия не выполнена, если вы не мутируете набор данных.
  • только изменил/добавил столбцы действительно копируются, все другие проходят по ссылке
  • Рам в R являются проходят по значению, которое Ий имитирует
  • рамки в Python могут пройти по ссылке, которая H2O имитаторы

Короче говоря, действуйте так, как в R, и все в порядке.

Никаких дополнительных копий.

+0

Спасибо, @Cliff. Чтобы подтвердить: нет метода 'data.table' esque для изменения исходной таблицы, но чтение в порядке. Прямо сейчас я возвращаю векторы обратно вызывающему абоненту, которому присваивается h2o, где Frame находится в области видимости, чтобы избежать локальной копии. Еще одна вещь, о которой я не уверен, - это то, что происходит, когда вы делаете (в основной области): 'dx = dx [dx $ col> 5,]'. Оба кадра в памяти на стороне H2O? – Ecognium

+1

В некоторых случаях H2O оптимизирует обновление на месте на стороне H2O и в любом случае будет быстро перерабатывать Big Temps. Для случая селектора строк оба кадра находятся в памяти ненадолго. На следующем R GC будет восстановлена ​​старая копия «dx». –