H2O 使用太多 RAM 和稀疏矩阵
H2O using too much RAM with Sparse Matrices
我将 H2O 与尺寸为 ~700,000 x ~800,000 的 SVMLight 稀疏矩阵一起使用。磁盘上的文件大小约为 800MB。但是导入H2O会占用超过300GB的RAM吗?该过程也需要很长时间(约 15 分钟)才能完成。
相比之下,我可以使用 Matrix 包快速创建稀疏矩阵并将其存储在 RAM 中。在这种情况下,稀疏矩阵需要大约 1.2GB 的 RAM。
下面是我的代码:
library(h2o)
h2o.init(nthreads=-1,max_mem_size = "512g")
x <- h2o.importFile('test2.svmlight', parse = TRUE)
这是我的系统:
openjdk version "1.8.0_121"
OpenJDK Runtime Environment (build 1.8.0_121-b13)
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)
Starting H2O JVM and connecting: .. Connection successful!
R is connected to the H2O cluster:
H2O cluster uptime: 2 seconds 76 milliseconds
H2O cluster version: 3.14.0.3
H2O cluster version age: 1 month and 8 days
H2O cluster name: H2O_started_from_R_ra2816_fhv677
H2O cluster total nodes: 1
H2O cluster total memory: 455.11 GB
H2O cluster total cores: 24
H2O cluster allowed cores: 24
H2O cluster healthy: TRUE
H2O Connection ip: localhost
H2O Connection port: 54321
H2O Connection proxy: NA
H2O Internal Security: FALSE
H2O API Extensions: XGBoost, Algos, AutoML, Core V3, Core V4
R Version: R version 3.4.1 (2017-06-30)
我非常感谢任何建议,因为我真的很喜欢 H2O 并且想将它用于这个项目。
H2O 将数据存储在列式压缩存储中,并经过优化以很好地处理具有大量(十亿+)行和大量(数千+)列的数据集。
每一列都存储在一堆 H2O 所谓的块中。块是一组连续的行。一个块可能是稀疏的,所以如果一个块包含 10,000 行并且它们都丢失了,那么该块所需的内存量可能非常小。但是块仍然需要在那里。
实际上,这意味着 H2O 稀疏地存储行但不稀疏地存储列。因此它不会像用于宽数据的纯稀疏矩阵包那样有效地存储东西。
在您的特定情况下,800,000 根色谱柱正在推动 H2O 的极限。
有些人对 H2O 不了解的一件事是它可以有效地处理分类列。因此,如果您通过手动对数据进行 1-hot 编码来获得列爆炸,则不需要使用 H2O 来实现。另一种数据表示会更有效。
我将 H2O 与尺寸为 ~700,000 x ~800,000 的 SVMLight 稀疏矩阵一起使用。磁盘上的文件大小约为 800MB。但是导入H2O会占用超过300GB的RAM吗?该过程也需要很长时间(约 15 分钟)才能完成。
相比之下,我可以使用 Matrix 包快速创建稀疏矩阵并将其存储在 RAM 中。在这种情况下,稀疏矩阵需要大约 1.2GB 的 RAM。
下面是我的代码:
library(h2o)
h2o.init(nthreads=-1,max_mem_size = "512g")
x <- h2o.importFile('test2.svmlight', parse = TRUE)
这是我的系统:
openjdk version "1.8.0_121"
OpenJDK Runtime Environment (build 1.8.0_121-b13)
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)
Starting H2O JVM and connecting: .. Connection successful!
R is connected to the H2O cluster:
H2O cluster uptime: 2 seconds 76 milliseconds
H2O cluster version: 3.14.0.3
H2O cluster version age: 1 month and 8 days
H2O cluster name: H2O_started_from_R_ra2816_fhv677
H2O cluster total nodes: 1
H2O cluster total memory: 455.11 GB
H2O cluster total cores: 24
H2O cluster allowed cores: 24
H2O cluster healthy: TRUE
H2O Connection ip: localhost
H2O Connection port: 54321
H2O Connection proxy: NA
H2O Internal Security: FALSE
H2O API Extensions: XGBoost, Algos, AutoML, Core V3, Core V4
R Version: R version 3.4.1 (2017-06-30)
我非常感谢任何建议,因为我真的很喜欢 H2O 并且想将它用于这个项目。
H2O 将数据存储在列式压缩存储中,并经过优化以很好地处理具有大量(十亿+)行和大量(数千+)列的数据集。
每一列都存储在一堆 H2O 所谓的块中。块是一组连续的行。一个块可能是稀疏的,所以如果一个块包含 10,000 行并且它们都丢失了,那么该块所需的内存量可能非常小。但是块仍然需要在那里。
实际上,这意味着 H2O 稀疏地存储行但不稀疏地存储列。因此它不会像用于宽数据的纯稀疏矩阵包那样有效地存储东西。
在您的特定情况下,800,000 根色谱柱正在推动 H2O 的极限。
有些人对 H2O 不了解的一件事是它可以有效地处理分类列。因此,如果您通过手动对数据进行 1-hot 编码来获得列爆炸,则不需要使用 H2O 来实现。另一种数据表示会更有效。