代码之家  ›  专栏  ›  技术社区  ›  lisprogtor

怎样给摩押更多的记忆?

  •  6
  • lisprogtor  · 技术社区  · 7 年前

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

    大约过了8个小时,我因记忆犹新而惊慌失措。我该如何给摩押文更多的记忆?不幸的是,我不能把这200万分成块,然后先写入文件,因为部分数据分析需要整个200万行。

    非常感谢你!!!

    lisprog语言

    2 回复  |  直到 7 年前
        1
  •  4
  •   raiph    7 年前

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

    • 如果你还没有准备好两个小样本文件。保持它们很小。我建议一个2000行长的文件和一个20000行长的文件。如果您已经有了一些大约该长度的示例文件,那么就可以了。为每个文件运行程序,记录每个文件花费的时间和使用的内存量。

    • 用你关于持续时间和RAM使用的笔记更新你的问题;如果可能的话加上到你的源代码的链接,如果可能的话加上示例文件。

    • 再次运行两个示例文件,但如前所述使用探查器 here . 看看有什么可以看到并更新你的问题。

    如果你不知道怎么做这些事情,请在评论中提问。

    如果以上所有操作都相当简单,请重复10万行文件。

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

        2
  •  6
  •   Jonathan Worthington    7 年前

    MoarVM没有自己的内存上限(例如,与JVM不同)。相反,只有当从操作系统请求内存而该请求被拒绝时,才会出现“内存不足”或“内存分配失败”错误。这可能是因为配置了内存限制,也可能是因为没有足够的可用RAM/交换空间来满足请求(可能是因为没有配置限制)。

    考虑到问题中的程序细节不多,很难对下一步的尝试给出具体的建议,但可能会有帮助的是:

    • 如果您正在将文件中的数据处理为其他数据结构,并且有可能这样做,那么请惰性地读取该文件(例如, for $fh.lines { ... } 只需要保留 Str 对于当前正在内存中处理的行,而 my @lines = $fh.lines; for @lines { } 将保留所有 Str公司 周围的物体)。
    • 这些数据是ASCII文件还是拉丁文-1文件?如果是,请通过 :enc<ascii> 或类似的打开文件。这可能导致更小的内存表示。
    • 如果保留整数、数字或字符串的大数组,请考虑使用本机类型的数组。例如,如果 my int8 @a 存储一百万个元素,然后占用1 MB内存;使用 my @a 它们都将被装箱在 Scalar 容器,在64位的机器上可以吃掉超过70MB。如果您有一个对象,使其具有许多实例,并且可能能够使某些属性成为本机属性,则类似的情况也适用。
    推荐文章