perl6 如何给 MoarVM 更多内存?
perl6 How to give more memory to MoarVM?
我要运行对大约200万行数据进行数据分析,每行大约250字节长。所以总共有大约 500 兆字节的数据。我正在 运行 在 Virtualbox Linux 上使用 4G 内存使用最新的 Rakudo。
大约 8 小时后,由于 运行ning 内存不足,我遇到了 MoarVM 恐慌。如何为 MoarVM 提供更多内存?不幸的是,我不能将 200 万分成块并先写入文件,因为部分数据分析需要整个 2 米行。
我建议您分几步解决您的问题:
准备两个小示例文件(如果您还没有的话)。保持它们很小。我建议一个 2,000 行长的文件和一个 20,000 行长的文件。如果您已经有一些大约该长度的示例文件,那么这些文件就可以了。 运行 每个文件的程序,注意每个文件花费的时间和使用的内存量。
用关于持续时间和 RAM 使用的注释更新您的问题;如果可能的话加上指向您的源代码的链接,如果可能的话加上示例文件。
运行 再次使用两个示例文件,但使用分析器,如 here 所述。查看内容以查看并更新您的问题。
如果您不知道如何做这些事情,请在评论中提问。
如果以上所有操作都相当简单,请重复一个 100,000 行的文件。
那么我们应该有足够的数据来给你更好的指导。
MoarVM 没有自己的内存上限(与 JVM 不同)。相反,它仅在从操作系统请求内存并且该请求被拒绝时才会给出 "out of memory" 或 "memory allocation failed" 错误。这可能是因为配置的内存限制,或者可能真的没有那么多可用 RAM/swap space 来满足所提出的请求(可能如果你没有配置限制) .
鉴于问题中的程序细节很少,很难就下一步尝试提供具体建议,但一些可能有帮助的事情是:
- 如果您正在将文件中的数据处理成其他数据结构,并且有可能这样做,请延迟读取文件(例如,
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 的空间。如果您有一个对象,您创建了很多实例,并且可能能够使某些属性成为本机属性,则类似情况也适用。
我要运行对大约200万行数据进行数据分析,每行大约250字节长。所以总共有大约 500 兆字节的数据。我正在 运行 在 Virtualbox Linux 上使用 4G 内存使用最新的 Rakudo。
大约 8 小时后,由于 运行ning 内存不足,我遇到了 MoarVM 恐慌。如何为 MoarVM 提供更多内存?不幸的是,我不能将 200 万分成块并先写入文件,因为部分数据分析需要整个 2 米行。
我建议您分几步解决您的问题:
准备两个小示例文件(如果您还没有的话)。保持它们很小。我建议一个 2,000 行长的文件和一个 20,000 行长的文件。如果您已经有一些大约该长度的示例文件,那么这些文件就可以了。 运行 每个文件的程序,注意每个文件花费的时间和使用的内存量。
用关于持续时间和 RAM 使用的注释更新您的问题;如果可能的话加上指向您的源代码的链接,如果可能的话加上示例文件。
运行 再次使用两个示例文件,但使用分析器,如 here 所述。查看内容以查看并更新您的问题。
如果您不知道如何做这些事情,请在评论中提问。
如果以上所有操作都相当简单,请重复一个 100,000 行的文件。
那么我们应该有足够的数据来给你更好的指导。
MoarVM 没有自己的内存上限(与 JVM 不同)。相反,它仅在从操作系统请求内存并且该请求被拒绝时才会给出 "out of memory" 或 "memory allocation failed" 错误。这可能是因为配置的内存限制,或者可能真的没有那么多可用 RAM/swap space 来满足所提出的请求(可能如果你没有配置限制) .
鉴于问题中的程序细节很少,很难就下一步尝试提供具体建议,但一些可能有帮助的事情是:
- 如果您正在将文件中的数据处理成其他数据结构,并且有可能这样做,请延迟读取文件(例如,
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 的空间。如果您有一个对象,您创建了很多实例,并且可能能够使某些属性成为本机属性,则类似情况也适用。