6

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

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

4

2 回答 2

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。如果您有一个创建许多实例的对象,并且可能能够使某些属性成为本地属性,则类似的情况也适用。
于 2018-08-04T16:18:48.893 回答
4

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

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

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

  • 再次运行这两个示例文件,但使用此处说明的分析器。查看有什么可以查看并更新您的问题。

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

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

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

于 2018-08-03T23:27:40.303 回答