【问题标题】:perl6 How to give more memory to MoarVM?perl6 如何给 MoarVM 更多的内存?
【发布时间】:2019-12-06 21:42:01
【问题描述】:

我必须对大约 200 万行数据进行数据分析,每行大约 250 字节长。所以总共大约有 500 兆字节的数据。我正在使用 4G 内存的 Virtualbox Linux 上运行最新的 Rakudo。

大约 8 小时后,由于内存不足,我遇到了 MoarVM 恐慌。如何为 MoarVM 提供更多内存?不幸的是,我无法将 200 万个数据块分成块并首先写入文件,因为部分数据分析需要整个 2 米行。

【问题讨论】:

  • 可能值得跟踪内存使用情况,看看是否有部分代码过度使用内存。
  • @lisprogtor 我真的很想知道发生了什么...
  • 您好,raiph,感谢您的帮助。我正在阅读有关探查器的信息,但还不精通它。为了有时间把事情做好,我最终做的是从所有 2M 行中分离出一个需要一些信息的数据数组并首先处理它;我将 2M 行写入磁盘并从文件中读取。到目前为止它正在工作。我仍在阅读分析器。谢谢!!!

标签: memory raku moarvm


【解决方案1】:

MoarVM 没有自己的内存上限(例如,与 JVM 不同)。相反,只有当操作系统请求内存并且该请求被拒绝时,它才会给出“内存不足”或“内存分配失败”错误。这可能是因为配置了内存限制,也可能是真的没有那么多可用的 RAM/交换空间来满足发出的请求(可能是您没有配置限制)。

鉴于问题中的程序细节很少,很难就下一步尝试提供具体建议,但一些可能有帮助的事情是:

  • 如果您正在将文件中的数据处理成其他数据结构,并且可以这样做,请懒惰地读取文件(例如,for $fh.lines { ... } 只需保留当前行的Str在内存中处理,而my @lines = $fh.lines; for @lines { } 将保留所有Str 对象。
  • 文件中的数据是 ASCII 还是 Latin-1?如果是这样,请在打开文件时传递:enc<ascii> 或类似名称。这可能会导致更小的内存表示。
  • 如果保留整数、数字或字符串的大型数组,请考虑使用本机类型数组。例如,如果您有my int8 @a 并存储一百万个元素,则需要 1 MB 内存;使用my @a 执行此操作,它们都将成为Scalar 容器内的盒装对象,该容器在可以吃超过70MB 的64 位机器上。如果您有一个创建了许多实例的对象,并且可能能够将某些属性设为原生,则类似情况。

【讨论】:

  • 非常感谢乔纳森·沃辛顿!我有这 2M 行的数组和散列。那可能是一些需要修改的代码。谢谢。
  • 如果“要修改的代码”是指您的代码,可以工作的代码,那么我敦促您退后一步,重新考虑。是的,您需要更改代码的可能性很小。但是有更大的机会“没有那么多可用的 RAM/交换空间来满足所提出的请求”,这“如果你没有配置限制”。您是否配置了限制?这将是 jnthn 建议的第一件事。如果你不知道怎么做,你必须问。除非必须,否则不要更改代码!!!如果您知道您的 RAM 设置已用尽,请阅读我的 LOUD!!!评论我的回答。 :)
【解决方案2】:

我建议你分几个步骤解决你的问题:

  • 如果您还没有准备两个小样本文件,请准备好。保持它们非常小。我建议一个 2,000 行长的文件和一个 20,000 行长的文件。如果您已经有一些大约该长度的示例文件,那么这些文件就可以了。为每个文件运行程序,注意每个文件花费了多长时间以及使用了多少内存。

  • 用关于持续时间和 RAM 使用的注释更新您的问题;如果可能的话,加上指向您的源代码和示例文件的链接(如果可能的话)。

  • 再次运行这两个示例文件,但按照here 的说明使用分析器。查看有什么要查看的内容并更新您的问题。

如果您不知道如何做这些事情,请在 cmets 中询问。

如果以上所有内容都相当简单,请重复 100,000 行文件。

那我们应该有足够的数据给你更好的指导。

【讨论】:

  • 非常感谢 raiph !我的代码在 5、100、200K 行数据中没有错误,但 Moar 对整个 2M 行数据感到恐慌。我想是时候重新编码了。谢谢!
  • “我的代码没有错误”我已经假设了。 “我想是时候重新编码了。”不!专注于你遇到的一个问题。这是OOM!!!不要在盲目时通过更改 WORKING 代码来创建错误。相反,您必须收集和共享有关代码内存使用的数据。如果你不知道你必须问问题才能找到答案。您必须了解如何使用 PROFILER。您只需要更改代码的一小部分。但是哪一部分?永远不要猜!相反,您必须配置文件,直到您首先知道问题出在哪里。只有这样你/我们才会关注 jnthn 的优秀提示。
  • “我的代码在 5、100、200K 行数据中没有错误”。运行 5K 文件时使用了多少 RAM? 100K文件呢?请更新您的答案以这样说。 (当你在讨论它时,每个人也需要多长时间。)如果你首先关注 jnthn 的交换空间配置技巧和/或收集和 共享(在您的问题中)有关您现有代码如何运行的数据,包括学习使用我的答案中的链接中解释的内置分析器,而不是查看您的代码并摆弄它。
  • 谢谢你! Profiler 对我来说是全新的,我现在开始阅读文档。让我试验一下。谢谢!!!
  • 很高兴听到,但是前面的步骤呢?按照顺序,我的目标应该是 1) Know what memory your program is using overall 用于 5K 和 100K 的运行; 2)让我们知道,还有时间; 3) 配置 VirtualBox 以增加您的交换空间(增加到 4GB); 4)学习profiler; 5) 让我们了解一些基本统计数据,了解您在分析器下看到的 5K 和 100K 运行情况。
猜你喜欢
  • 2016-05-03
  • 1970-01-01
  • 2011-01-26
  • 2012-06-21
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
相关资源
最近更新 更多