当前位置: 首页 > 知识库问答 >
问题:

如何用H2O处理大数据集

蒋星驰
2023-03-14

我正在尝试用H2O(3.14)训练机器学习模型。我的数据集大小是4Gb,我的计算机RAM是2Gb,带有2G交换,JDK 1.8。参考本文,H2O可以使用2Gb RAM处理大型数据集。

  • 关于大数据和GC的说明:当Java堆太满时,我们会进行用户模式的磁盘交换,即,您使用的大数据比物理DRAM多。我们不会因GC死亡螺旋而死亡,但我们会降级到核心外的速度。我们将以磁盘允许的速度运行。我个人测试过将12Gb数据集加载到2Gb(32位)JVM中;加载数据大约需要 5 分钟,运行逻辑回归需要 5 分钟。

围绕这个问题的一些问题:

  • 在h2o中加载大于内存大小的数据。答案提到,由于性能太差,用户模式与磁盘的交换被禁用。然而,他没有解释任何替代方法,以及如何在h2o中启用标志--cleaner

我用选项java-Xmx10g-jar h2o.jar配置了java堆。当我加载数据集时。H2O信息如下:

然而,JVM消耗了所有的RAM内存和交换空间,然后操作系统停止了java h2o程序。

我安装了H2O火花。我可以加载数据集,但火花与以下日志一起挂起,并具有完整的交换内存:

 + FREE:426.8 MB == MEM_MAX:2.67 GB), desiredKV=841.3 MB OOM!
09-01 02:01:12.377 192.168.233.133:54321 6965   Thread-47 WARN: Swapping!  OOM, (K/V:1.75 GB + POJO:513.2 MB + FREE:426.8 MB == MEM_MAX:2.67 GB), desiredKV=841.3 MB OOM!
09-01 02:01:12.377 192.168.233.133:54321 6965   Thread-48 WARN: Swapping!  OOM, (K/V:1.75 GB + POJO:513.2 MB + FREE:426.8 MB == MEM_MAX:2.67 GB), desiredKV=841.3 MB OOM!
09-01 02:01:12.381 192.168.233.133:54321 6965   Thread-45 WARN: Swapping!  OOM, (K/V:1.75 GB + POJO:513.3 MB + FREE:426.7 MB == MEM_MAX:2.67 GB), desiredKV=803.2 MB OOM!
09-01 02:01:12.382 192.168.233.133:54321 6965   Thread-46 WARN: Swapping!  OOM, (K/V:1.75 GB + POJO:513.4 MB + FREE:426.5 MB == MEM_MAX:2.67 GB), desiredKV=840.9 MB OOM!
09-01 02:01:12.384 192.168.233.133:54321 6965   #e Thread WARN: Swapping!  GC CALLBACK, (K/V:1.75 GB + POJO:513.4 MB + FREE:426.5 MB == MEM_MAX:2.67 GB), desiredKV=802.7 MB OOM!
09-01 02:01:12.867 192.168.233.133:54321 6965   FJ-3-1    WARN: Swapping!  OOM, (K/V:1.75 GB + POJO:513.4 MB + FREE:426.5 MB == MEM_MAX:2.67 GB), desiredKV=1.03 GB OOM!
09-01 02:01:13.376 192.168.233.133:54321 6965   Thread-46 WARN: Swapping!  OOM, (K/V:1.75 GB + POJO:513.2 MB + FREE:426.8 MB == MEM_MAX:2.67 GB), desiredKV=803.2 MB OOM!
09-01 02:01:13.934 192.168.233.133:54321 6965   Thread-45 WARN: Swapping!  OOM, (K/V:1.75 GB + POJO:513.2 MB + FREE:426.8 MB == MEM_MAX:2.67 GB), desiredKV=841.3 MB OOM!
09-01 02:01:12.867 192.168.233.133:54321 6965   #e Thread WARN: Swapping!  GC CALLBACK, (K/V:1.75 GB + POJO:513.2 MB + FREE:426.8 MB == MEM_MAX:2.67 GB), desiredKV=803.2 MB OOM!

在这种情况下,我认为gc收集器正在等待清理交换中一些未使用的内存。

如何用有限的RAM内存处理大型数据集?


共有2个答案

司徒瀚
2023-03-14

引用的2014年的文章已经过时很多年了,指的是H2O-2。H2O内用户模式交换到磁盘的概念在当时是实验性的。

但正如引用的StackOverflow帖子所解释的那样,H2O-3(大约在2015年初成为主要的H2O代码库)从未支持过这一点,因为性能很差。

庄智
2023-03-14

如果这是商业性的,请购买更多的RAM,或者支付几美元在云服务器上租用几个小时。

这是因为在太小的机器上进行机器学习的额外时间和精力是不值得的。

如果这是一个学习项目,根本没有预算:将数据集分成8个大小相等的部分(*),然后只使用第一部分来制作和调整模型。(如果数据不是随机排列的,则将其切成32个相等的部分,然后连接第1、9、17和25部分;或类似的内容。)

如果你真的,真的,真的,必须用整个数据集建立一个模型,那么还是做上面的。然后保存模型,然后移动到8个数据集的第2个。至此,您已经有了调整过的超参数,所以您只是在生成一个模型,而且会很快。重复第3至第8部分。现在你有8个模型,并且可以在合奏中使用它们。

*:我选择了8,这为您提供了0.5GB的数据集,这是可用内存的四分之一。对于早期的实验,我实际上建议更小,例如50MB,因为这将使迭代更快。

还有几个想法:

    < li>H2O压缩内存中的数据。因此,如果4GB是未压缩的数据大小,您可以使用较小的内存。(但是,请记住,建议的内存大小是数据大小的3-4倍。) < li >如果您的一些朋友有类似的小内存计算机,您可以将它们联网。4到8台计算机可能足以加载您的数据。它可能工作得很好,也可能非常慢,这取决于算法(以及你的网络有多快)。
 类似资料:
  • 问题内容: 我正在寻找一种数学解决方案,该解决方案可以处理真实(长,大,大,风暴)数字。我还没有发现任何东西,但是我不想现在这个问题还没有解决。我正在寻找一种简单的Number解决方案,例如MicrosoftExcelPrecision(30位十进制)或BigInteger(Java)解决方案。当然是用Java语言编写的。 问题答案: BigInt现在是Firefox和Chrome的一部分; 你不

  • 问题内容: 我用来并行化一些繁重的计算。 目标函数返回大量数据(庞大的列表)。我的RAM用完了。 如果不使用,我只需将生成的元素依次计算出来,就将目标函数更改为生成器。 我了解多处理不支持生成器- 它等待整个输出并立即返回,对吗?没有屈服。有没有一种方法可以使工作人员在数据可用时立即产生数据,而无需在RAM中构造整个结果数组? 简单的例子: 这是Python 2.7。 问题答案: 这听起来像是队列

  • 我的问题不是: < li >维护h2o数据帧的有效方法 < li>H2O运行速度比data.table R慢 < li >在h2o中加载大于内存大小的数据 硬件/空间: 32 个至强线程,带 ~256 GB 内存 要上传约 65 GB 的数据。(约56亿个细胞) 问题: 将数据上传到h2o需要几个小时。这不是任何特殊处理,只是“as.h2o(...)”。 使用“fread”将文本放入空间只需要不到

  • (自己模拟的数据效果) 如上路径动画,目前的问题是运行的坐标数据是依照地图来的 需要转换为画布能够展示的范围,但运行数据之前差别大部分情况下都很小 我要怎样处理会合适一点? help大佬们

  • 问题内容: 我有一个Java应用程序,它需要显示大量数据(大约一百万个数据点)。数据并不需要全部同时显示,而仅在用户请求时才显示。该应用程序是桌面应用程序,未与应用程序服务器一起运行或未与任何集中式数据库连接。 我的想法是在计算机上运行数据库并在其中加载数据。在大多数时候,数据库都是只读的,因此我应该能够建立索引以帮助优化查询。如果我在本地系统上运行,则不确定是否应该尝试实现一些缓存(我不确定查询

  • 如果我只有一个内存为25 GB的执行器,并且如果它一次只能运行一个任务,那么是否可以处理(转换和操作)1 TB的数据?如果可以,那么将如何读取它以及中间数据将存储在哪里? 同样对于相同的场景,如果hadoop文件有300个输入拆分,那么RDD中会有300个分区,那么在这种情况下这些分区会在哪里?它会只保留在hadoop磁盘上并且我的单个任务会运行300次吗?