perl6如何为MoarVM提供更多内存?

lis*_*tor 6 memory perl6 moarvm

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

大约8个小时后,由于内存不足,我得到了MoarVM的恐慌.如何为MoarVM提供更多内存?不幸的是,由于部分数据分析需要整个2米的行,所以我不能将2百万分成块并写入文件.

非常感谢你 !!!

lisprog

Jon*_*ton 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.如果您有一个可以创建许多实例的对象,并且可能能够将某些属性设置为本机,则类似也适用.


rai*_*iph 4

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

  • 如果尚未准备好,请准备两个小示例文件。让它们非常小。我建议一个 2,000 行长的文件和一个 20,000 行长的文件。如果您已经有一些大约该长度的示例文件,那么这些就可以了。为每个文件运行程序,记录每个文件花费的时间以及使用的内存量。

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

  • 再次运行这两个示例文件,但使用此处所述的探查器。查看有什么内容可以查看并更新您的问题。

如果您不知道如何做这些事情,请在评论中提问。

如果上述所有操作都相当简单,请对 100,000 行文件重复此操作。

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