【问题标题】:Python 3 - Limiting Memory Usage from a ScriptPython 3 - 限制脚本的内存使用
【发布时间】:2016-06-13 17:13:13
【问题描述】:

我正在使用 itertools 模块为一个相当长的句子中的字母顺序创建一个可能的排列列表。但是,每次我这样做时都会耗尽内存(在有人问之前我有 16GB RAM)。

我没有这台机器上的代码,但它并不是低效的代码,因为它是文档中示例之一的抄本,Python 试图一次完成的排列太多了.

问题是,有没有办法限制 Python 使用的内存量,也许是给它一个池?我知道我可能应该更改代码,但我也会从其他项目的内存池中受益。

我无法使用 Theano 模块,因为我使用的是不兼容的 Conda。我试过gc模块,效果不大,但代码还是一个例子,句子大约十几个字符,在屏幕上打印列表。

编辑:

这是我的代码的主要部分。 我不建议运行它,因为它会导致我的机器崩溃。

import itertools
f = open('File.txt','w')
for key, value in dict.items():
    print(list(itertools.permutations((str(counter-value)))),file=f)

dict 变量是一个包含 76 个元素的字典,其中包含代码检查的不同字符。代码的实际功能很复杂,适合一百行左右的脚本,但这是我遇到问题的地方。如果代码有效,它应该计算字面上数百万的排列。我的问题是它试图一次完成所有这些。我想知道是否有某种方法可以限制它,即使这意味着代码会运行得更慢。

【问题讨论】:

  • “它不是低效的代码,因为它是文档中示例之一的抄本”——这并不能使它成为高效的代码。对于极短的输入,迭代排列只是一个好主意。使用不这样做的算法。
  • 虽然限制内存使用是可能的,但这只是意味着您迟早会因MemoryError 而崩溃。
  • 点击MemoryError 的一般用例可能仍然比在机器上消耗更多内存更可取。
  • 也许我没有说清楚,我没有遇到任何 MemoryError。我在旁边打开了任务管理器,告诉我正在使用的资源,当程序运行时,图表即将达到 100%,然后整个计算机由于内存不足而死机。我很欣赏我的代码效率不高,但我想放慢速度。
  • @Master-chip 你想让它只打印列表中的元素吗?

标签: python python-3.x memory memory-management memory-leaks


【解决方案1】:

您可以遍历排列并将它们中的每一个写入文件,如下所示:

import itertools
f = open('File.txt','w')
for key, value in dict.items():
    for i in itertools.permutations((str(counter-value))):
        print(i, file=f)

因为它是一个生成器,所以项目会被一个一个地检索,所以你的内存不会被耗尽。

【讨论】:

  • 完美。谢谢。
猜你喜欢
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多