我需要对大约200万行数据进行数据分析,每行数据大约250字节。所以总共大约500兆字节的数据。我正在运行具有4G内存的Virtualbox Linux上的最新Rakudo版本。
大约8个小时后,由于内存不足,我得到了MoarVM恐慌。我该如何为MoarVM提供更多的内存?不幸的是,我不能将这200万行数据分成块并先写入文件,因为数据分析的一部分需要整个2M行。
我需要对大约200万行数据进行数据分析,每行数据大约250字节。所以总共大约500兆字节的数据。我正在运行具有4G内存的Virtualbox Linux上的最新Rakudo版本。
大约8个小时后,由于内存不足,我得到了MoarVM恐慌。我该如何为MoarVM提供更多的内存?不幸的是,我不能将这200万行数据分成块并先写入文件,因为数据分析的一部分需要整个2M行。
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。如果您有一个要创建许多实例的对象,并且可能能够使某些属性本地化,则类似的规则也适用。如果尚未准备好,请准备两个小的示例文件。保持它们非常小。我建议一个2000行长的文件和一个20000行长的文件。如果您已经有了大约那么长的一些示例文件,则可以使用这些文件。对于每个文件运行您的程序,记录每个文件所需的时间和内存使用情况。
更新您的问题并附上有关持续时间和RAM使用情况的注释;如果可能,请附上源代码链接和示例文件链接。
再次运行两个示例文件,但使用如此处所述的性能分析器。查看需要查看的内容并更新您的问题。
如果您不知道如何执行以上任何操作,请在评论中询问。
如果以上所有操作都相当容易,请针对100,000行的文件重复以上步骤。
然后我们应该有足够的数据来为您提供更好的指导。