Умножьте 2 очень больших фрейма данных в R

#r #dataframe #datatable

#r #фрейм данных #datatable

Вопрос:

У меня есть 2 фрейма данных в R, как показано ниже

Фрейм данных 1

 structure(list(X1 = c(1, 4, 3), X2 = c(2, 1, 2), X3 = c(3, 1, 
1)), class = "data.frame", row.names = c(NA, -3L))
 

Фрейм данных 2

 structure(list(X1 = c(0.5, 0.1), X2 = c(0.7, 0.2), X3 = c(0.3, 
0.2)), class = "data.frame", row.names = c(NA, -2L))
 

Я хочу умножить каждую строку DF1 на каждую строку DF2 и выполнить некоторые вычисления, как показано ниже. Это своего рода умножение матрицы вместе с дополнительными вычислениями

  1. После умножения матрицы я буду вычислять 1/(1 exp(-x)) для каждой ячейки в результирующей матрице
  2. и, наконец, возьмите сумму столбцов матрицы

Приведенный выше набор данных — это просто фиктивный набор. На самом деле DF1 содержит 1,1 миллиона строк, а DF2 — 65000 строк. При выполнении умножения матрицы я получаю сообщение об ошибке

 cannot allocate vector of Size 560 GB
 

Есть ли какая-либо альтернатива этому. Кроме того, я ищу эффективное по времени решение из-за больших фреймов данных.
Может быть таблица данных?

Спасибо,

Комментарии:

1. Сколько там столбцов? Если объем ваших данных составляет 560 ГБ, вы, возможно, вообще не сможете поместить их в память. Каковы типы данных — в вашем примере я вижу целые числа и числа с плавающей запятой. Есть ли какой-нибудь способ сделать их целыми и, если возможно, ограничить их размеры? (это может немного помочь, но не настолько)

2. DF1 содержит 1,1 миллиона строк и 16 столбцов, DF2 — 65000 строк и 16 столбцов. Тип данных — float.

3. Поскольку вы выполняете арифметику, а не матричное умножение, кажется, вы могли бы выполнять вычисления кусочно. Т.Е. меньшими подмножествами строк. И просто объедините конечные результаты в конце.

4. Дорогой, о, дорогой. Если в DF1 и DF2 было только по 1 столбцу, и вы хотели взять все комбинации их строк, результирующий DF будет иметь 16K * 1,1M = ~ 17G строк. 4 байта на строку (32-битное целое число), и у нас 68 ГБ памяти. Теперь умножьте это на 16, и у нас будет ~ 1088 ГБ памяти. К этому моменту я несколько удивлен, что выделенный вектор был только половинного размера. И к этому моменту у нас заканчивается не только память, но и дисковое пространство. Пожалуйста, поправьте меня, если моя салфетка-математика была где-то отключена ^^.

5. Я понимаю проблему. Есть ли какое-либо другое альтернативное решение для этого?