代码之家  ›  专栏  ›  技术社区  ›  Jason Coon

运行高内存消耗(python/perl)脚本的良好环境是什么?

  •  1
  • Jason Coon  · 技术社区  · 15 年前

    我正在从一些有更多经验的程序员那里寻找关于新开发系统的建议,但是让我介绍一下为什么。

    • 我们需要一个新的开发服务器 在大型订阅源上运行脚本
    • 速度不是问题,它只需要 完成
    • 脚本不是经常运行的, 通常是很快编码的 (未优化)使用python或perl

    当前问题:

    • 需要处理较大的源,并且由于内存错误,需要重构现有脚本来处理它们。
    • 运行脚本的系统是一台具有4GB RAM的Win32计算机,单个进程的空间不能超过2GB。

    我的团队没有花时间重构一个很少使用的脚本,而是希望能够向它投入更多的内存。我知道64位升级在这里会有所帮助,但我不确定运行需要大量内存的脚本时理想的环境类型,所以这就是我需要的建议。

    我一直在研究Solaris服务器、FreeBSD服务器,只是使用64位Windows…一旦安装了64位版本的python/perl,并且脚本实际上正在运行,就很难确定每个系统都能做些什么。如果系统有16GB的内存,我什么时候才能遇到单个进程的内存错误?

    其他一些事情:

    • 到远程服务器的ssh是可以接受的解决方案(可能是理想的,这样我们可以让多个用户运行脚本)
    • 我们有可用的vmware,因此如果有人对使用vmware客户机开发有经验/意见,这是另一个选择

    对于一个新系统的任何建议,或者在决定时我应该考虑的其他事情,都是很好的。

    4 回复  |  直到 15 年前
        1
  •  2
  •   Dirk is no longer here    15 年前

    我曾经在32位Linux(内存为4到8GB)上遇到过类似的问题,尽管使用了不同的脚本语言(R)。相当大的努力去切片和切块数据到适当的块 去肚皮。对于我分析的数据集,每个进程3GB的有效限制是一个真正的约束。

    现在,在64位Linux(有12到16GB的RAM)上,使用起来要容易得多。所以切片,不要切。它正好合适。

    所以,如果你的问题集处于最佳状态,考虑以最适合你的任何形式进入64位。正如Wazoox所提到的,安装Debian或Ubuntu是一件轻而易举的事情,特别是对于更小/更集中的“服务器”风格。

        2
  •  3
  •   S.Lott    15 年前

    “我的团队没有花时间重构一个很少使用的脚本。”

    显然,该脚本具有相当大的价值,即使很少运行。

    通常,小的变化会带来很大的好处。

    明确地,

    • 如果分解长代码段以隔离中间值和临时值,则允许更频繁地进行垃圾收集。把大函数分解成小函数。这可能是最困难的。

    • 如果你替换 range 具有 xrange ,您可以保存临时列表对象的创建。在某些情况下,您可能会发现循环可以从 enumerate ,替换range/xrange业务。这是一个快速的grep。

    • 如果您重新考虑任何字符串连接操作,并找到将它们放入(最终)与之合并的列表中的方法 " ".join( listOfStrings ) .您可以省去创建大量不太重要的临时中间字符串对象的麻烦。这需要阅读代码并进行重构才能找到 += 字符串之间的操作。

    您可能只需要一两个小时的工作就可以显著地减少内存消耗。

        3
  •  3
  •   wazoox    15 年前

    只需在适当的机器上安装适用于AMD64的Ubuntu或Debian。这很简单(比安装Freebsd或上帝禁止的OpenSolaris容易得多),非常简单,Perl和Python将是64位现成的,并且是默认安装的一部分。

        4
  •  1
  •   Martin v. Löwis    15 年前

    性能/内存使用方面,操作系统没有什么区别。在64位模式下,python可以很好地处理所有这些问题。64位模式的Unix支持比Windows支持早10年,因此Unix上的问题可能会稍微少一些。然而, large collections support 在所有系统上都是相当新的。因此,如果您希望有对大型集合的需求(而不仅仅是许多小型集合的嵌套),请为一些调试做好准备。

    还要注意,在64位系统上,所有指针的大小都将加倍。因此,要在32位系统上执行与2GB相同的工作,需要在64位系统上执行4GB。

    只有当交换空间耗尽时,系统才会耗尽内存,因此在16GB不够的情况下,要计划足够的交换空间。

    推荐文章