我必须对大约 200 万行数据进行数据分析,每行大约 250 字节长。所以总共大约有 500 兆字节的数据。我正在使用 4G 内存的 Virtualbox Linux 上运行最新的 Rakudo。
大约 8 小时后,由于内存不足,我得到了 MoarVM 恐慌。如何为 MoarVM 提供更多内存?不幸的是,我不能将 200 万个分成块并首先写入文件,因为部分数据分析需要整个 2 米行。
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。如果您有一个创建许多实例的对象,并且可能能够使某些属性成为本地属性,则类似的情况也适用。我建议你分几个步骤解决你的问题:
如果你还没有准备两个小样本文件。保持它们非常小。我建议一个 2,000 行长的文件和一个 20,000 行长的文件。如果您已经有一些大约该长度的示例文件,那么这些文件就可以了。为每个文件运行程序,注意每个文件花费了多长时间以及使用了多少内存。
用关于持续时间和 RAM 使用的注释更新您的问题;如果可能的话,加上指向您的源代码的链接,如果可能的话,还有示例文件的链接。
再次运行这两个示例文件,但使用此处说明的分析器。查看有什么可以查看并更新您的问题。
如果您不知道如何做这些事情,请在评论中提问。
如果以上所有内容都相当简单,请重复 100,000 行文件。
那么我们应该有足够的数据给你更好的指导。