我必须对大约200万行数据进行数据分析,每行大约250字节长。因此,总共约有500兆字节的数据。我正在具有4G内存的Virtualbox Linux上运行最新的Rakudo。
大约8个小时后,由于内存不足,使MoarVM出现了恐慌。如何为MoarVM提供更多内存?不幸的是,由于部分数据分析需要整个2-m行,因此我无法将200万分割成多个块并首先写入文件。
非常感谢您!
lisprog
答案 0 :(得分:6)
MoarVM没有自己的内存上限(与JVM不同)。而是,仅当从操作系统请求内存并且该请求被拒绝时,它才会给出“内存不足”或“内存分配失败”错误。这可能是由于配置的内存限制引起的,或者实际上可能是因为没有足够的可用RAM /交换空间来满足发出的请求(可能是因为您没有配置限制)。
鉴于问题中程序的细节很少,很难提供具体建议以解决下一步的问题,但是可能有帮助的一些事情是:
for $fh.lines { ... }
只需要保留Str
当前正在内存中处理的行,而my @lines = $fh.lines; for @lines { }
将保留所有Str
个对象)。:enc<ascii>
或类似内容。这可能会导致较小的内存表示形式。my int8 @a
并存储了一百万个元素,那么它将占用1 MB的内存;使用my @a
进行操作,它们都将被装在Scalar
容器内的盒装对象中,该容器在64位计算机上可能会消耗70MB以上的空间。如果您有一个对象要创建许多实例,并且可能能够使某些属性成为本地属性,则类似的情况也适用。答案 1 :(得分:4)
我建议您分几步解决问题:
如果尚未准备两个小样本文件,请准备。保持它们很小。我建议使用2,000行长的文件和20,000行长的文件。如果您已经有一些大约该长度的示例文件,那么这些文件就可以了。为每个文件运行程序,注意每个文件花费了多长时间以及使用了多少内存。
使用有关持续时间和RAM使用的注释更新您的问题;如果可能的话,还要加上指向您的源代码的链接,如果可能的话,还要提供示例文件。
按照here所述,使用分析器再次运行两个示例文件。看看有什么可以看的并更新您的问题。
如果您不知道该怎么做,请在评论中提问。
如果上述所有操作都很简单,请重复执行100,000行文件。
那么我们应该有足够的数据为您提供更好的指导。