【问题标题】:What are good environments for running high-memory-consuming (Python/Perl) scripts?运行高内存消耗 (Python/Perl) 脚本的良好环境是什么?
【发布时间】:2009-07-28 14:48:53
【问题描述】:

我正在寻找一些有更多经验的程序员对新开发系统的建议,但让我提供一些背景知识。

  • 我们需要一个新的开发服务器 在大型提要上运行脚本
  • 速度不是问题,它只需要 完成
  • 脚本不经常运行, 并且通常编码非常快 (未优化)使用 Python 或 Perl

当前问题:

  • 需要处理较大的提要,并且由于内存错误,需要重构现有脚本以处理它们
  • 运行脚本的系统是一台具有 4GB RAM 的 Win32 机器,单个进程永远不会被允许超过 2GB 的空间

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

我一直在研究 Solaris 服务器、FreeBSD 服务器,仅使用 64 位 Windows...一旦安装了 64 位版本的 Python/Perl 和脚本,很难弄清楚每个系统的功能实际上正在运行。如果系统有 16GB 内存,我什么时候会遇到单个进程的内存错误?

其他一些事情:

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

任何关于新系统的建议,或者我在决定时应该考虑的其他事情都会很棒。

【问题讨论】:

    标签: linux memory scripting 64-bit development-environment


    【解决方案1】:

    “而不是我的团队花时间重构一个很少使用的脚本,”

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

    通常,小的改变会产生大的好处。

    具体来说,

    • 如果您分解较长的代码段以隔离中间值和临时值,则允许更频繁的垃圾回收。将大功能分解为小功能。这也许是最难的。

    • 如果将range 替换为xrange,则可以省去创建临时列表对象的时间。在某些情况下,您可能会发现可以从enumerate 中受益的循环,取代 range/xrange 业务。这是一个快速的 grep。

    • 如果您重新考虑任何字符串连接操作并想办法将它们放入您(最终)与" ".join( listOfStrings ) 合并的列表中。您将节省自己创建许多不重要的瞬态中间字符串对象。这需要阅读代码并进行一些重构以在字符串中找到+= 操作。

    只需一两个小时的工作,您就可以显着减少内存消耗。

    【讨论】:

    • 我们目前正在这样做,你是对的 S.Lott... 不会超过一两个小时。我们还在有意义的地方使用了持久性对象,并拆分处理成批次,结果可以合并。不过,我们可以接受具有大量 RAM 的新系统,而且它比支付开发人员花费 x 小时的重构工作更便宜。更像是我们将为一些脚本提供这个系统,同时重构其他脚本,同时处理新项目。
    • 有人知道 Python 是如何使用大量虚拟内存的吗?它的地理位置如何,您如何鼓励它?
    • @coonj:在糟糕的设计上投入内存可能没有多大帮助。它可能会在崩溃之前运行更长时间。您无需在返工上花费无限时间。足够的时间来克服最令人震惊的记忆猪。通常,内存占用者还有许多其他问题。
    • @David Thornley:请将此作为单独的问题发布。当你这样做时,请澄清你的问题以定义“地方”和“鼓励”。 【鼓励谁?做什么?]
    【解决方案2】:

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

    【讨论】:

    • 你会在发行版中获得大量 Perl / Python 模块。
    【解决方案3】:

    我曾经在 32 位 Linux(内存为 4 到 8 GB)上遇到过类似的问题,尽管使用的是不同的脚本语言 (R)。为了将数据分割成适当的块,我们付出了相当大的努力。每个进程 3gb 的有效限制是我正在分析的数据集的真正限制。

    现在在 64 位 Linux(具有 12 到 16GB 的内存)上,生活要容易得多。如此切片,不切丁。刚好合适。

    因此,如果您的问题集处于最佳状态,请考虑以最适合您的任何形式使用 64 位。正如 wazoox 所提到的,Debian 或 Ubuntu 的安装轻而易举,尤其是对于更小/更专注的“服务器”风格。

    【讨论】:

    • 这听起来很相似......很高兴知道它对你有用。谢谢
    【解决方案4】:

    在性能/内存使用方面,操作系统没有太大区别。 Python 在 64 位模式下都可以很好地工作。 Unix 对 64 位模式的支持比 Windows 支持早了十年,因此 Unix 上的问题可能会稍微少一些。但是,large collections support 在所有系统上都是相当新的。因此,如果您预计需要大型集合(而不仅仅是许多小集合的嵌套),请准备好进行一些调试。

    还要注意,在 64 位系统上,所有指针的大小都会翻倍。因此,要在 32 位系统上使用 2GB 完成相同的工作,在 64 位系统上需要 4GB。

    只有在交换空间用完时系统才会耗尽内存,因此请计划足够的交换空间以防 16GB 不够用。

    【讨论】:

    • 请记住 (a) 并非所有内容都是指针,因此从 32 位变为 64 位不会使内存需求加倍,并且 (b) 如果没有足够的实际内存,脚本将开始抖动,并且在一个非常大的数据集上颠簸意味着没有在任何合理的时间内完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多