perl6如何为MoarVM分配更多内存?

时间:2018-08-03 16:49:07

标签: memory perl6 moarvm

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

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

非常感谢您!

lisprog

2 个答案:

答案 0 :(得分:6)

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容器内的盒装对象中,该容器在64位计算机上可能会消耗70MB以上的空间。如果您有一个对象要创建许多实例,并且可能能够使某些属性成为本地属性,则类似的情况也适用。

答案 1 :(得分:4)

我建议您分几步解决问题:

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

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

  • 按照here所述,使用分析器再次运行两个示例文件。看看有什么可以看的并更新您的问题。

如果您不知道该怎么做,请在评论中提问。

如果上述所有操作都很简单,请重复执行100,000行文件。

那么我们应该有足够的数据为您提供更好的指导。