【问题标题】:memory error in pythonpython中的内存错误
【发布时间】:2012-07-02 06:00:30
【问题描述】:
Traceback (most recent call last):
File "/run-1341144766-1067082874/solution.py", line 27, in 
main()
File "/run-1341144766-1067082874/solution.py", line 11, in main
if len(s[i:j+1]) > 0:
MemoryError
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/apport_python_hook.py", line 64, in apport_excepthook
from apport.fileutils import likely_packaged, get_recent_crashes
File "/usr/lib/python2.7/dist-packages/apport/__init__.py", line 1, in 
from apport.report import Report
MemoryError

Original exception was:
Traceback (most recent call last):
File "/run-1341144766-1067082874/solution.py", line 27, in 
main()
File "/run-1341144766-1067082874/solution.py", line 11, in main
if len(s[i:j+1]) > 0:
MemoryError

当我尝试运行以下程序时出现上述错误。有人可以解释什么是内存错误,以及如何克服这个问题? . 程序将字符串作为输入并查找所有可能的子字符串并从中创建一个集合(按字典顺序),它应该在用户询问的相应索引处打印值,否则它应该打印'无效'

def main():
    no_str = int(raw_input())
    sub_strings= []
    for k in xrange(0,no_str):
        s = raw_input()
        a=len(s)
        for i in xrange(0, a):
            for j in xrange(0, a):
                if j >= i:
                    if len(s[i:j+1]) > 0:
                        sub_strings.append(s[i:j+1])
    sub_strings = list(set(sub_strings))
    sub_strings.sort()
    queries= int(raw_input())
    resul = []
    for i in xrange(0,queries):
        resul.append(int(raw_input()))
    for p in resul:
        try:
            print sub_strings[p-1]
        except IndexError:
            print 'INVALID'


if __name__ == "__main__":
   main()

【问题讨论】:

标签: python memory


【解决方案1】:

如果您收到意外的MemoryError,并且您认为应该有足够的 RAM 可用,这可能是因为您使用的是 32 位 python 安装。

如果您有 64 位操作系统,简单的解决方案是切换到 64 位安装的 python。

问题在于 32 位 python 只能访问 ~4GB 的 RAM。如果您的操作系统是 32 位,由于操作系统开销,这可能会进一步缩小。

您可以在此处详细了解为何 32 位操作系统限制为 ~4GB RAM:https://superuser.com/questions/372881/is-there-a-technical-reason-why-32-bit-windows-is-limited-to-4gb-of-ram

【讨论】:

  • 在 Windows 中切换的快速说明 - 检测您是否正在运行 32 位 stackoverflow.com/questions/1842544 - 从 python.org 下载 64 位版本,并安装它 - 更新您的 PATH 变量到新安装
【解决方案2】:

这里是这个:

s = raw_input()
a=len(s)
for i in xrange(0, a):
    for j in xrange(0, a):
        if j >= i:
            if len(s[i:j+1]) > 0:
                sub_strings.append(s[i:j+1])

对于大字符串来说似乎效率很低而且成本很高。

最好做

for i in xrange(0, a):
    for j in xrange(i, a): # ensures that j >= i, no test required
        part = buffer(s, i, j+1-i) # don't duplicate data
        if len(part) > 0:
            sub_Strings.append(part)

缓冲区对象保留对原始字符串以及开始和长度属性的引用。这样,就不会发生不必要的数据重复。

长度为l 的字符串有l*l/2 的平均长度为l/2 的子字符串,因此内存消耗大致为l*l*l/4。有了缓冲区,它就小得多了。

请注意,buffer() 仅存在于 2.x 中。 3.x 有memoryview(),使用方式略有不同。

更好的是计算索引并按需删除子字符串。

【讨论】:

    【解决方案3】:

    memory error 表示您的程序内存不足。这意味着您的程序以某种方式创建了太多对象。

    在您的示例中,您必须查找可能会消耗大量内存的算法部分。我怀疑您的程序被赋予了很长的字符串作为输入。因此,s[i:j+1] 可能是罪魁祸首,因为它创建了一个新列表。但是,第一次使用它时,它不是必需的,因为您不使用创建的列表。您可以尝试看看以下是否有帮助:

    if  j + 1 < a:
        sub_strings.append(s[i:j+1])
    

    要替换第二个列表创建,您绝对应该使用buffer 对象,正如glglgl 所建议的那样。

    还请注意,由于您使用if j &gt;= i:,因此您无需将xrange 从 0 开始。您可以:

    for i in xrange(0, a):
        for j in xrange(i, a):
            # No need for if j >= i
    

    一个更激进的选择是尝试重新设计您的算法,这样您就不会预先计算所有可能的子字符串。相反,您可以简单地计算所要求的子字符串。

    【讨论】:

    • 我已经知道了,多解释一下为什么会发生这种情况会更有帮助。
    • 我只是想为您的问题标题提供一个明确的答案,以防其他人发现它正在寻找 MemoryError 和 Python。
    • @kratos 你问它:“有人可以解释什么是内存错误,”
    【解决方案4】:

    您的代码中存在错误或内存不足,您可以升级它或为了快速解决方案尝试增加您的虚拟内存。

    1. 打开我的电脑
    2. 右键单击并选择属性
    3. 进入高级系统设置
    4. 点击高级选项卡
    5. Click on settings under Performance
    6. Click on Change under Advance Tab
    7. 增加内存大小,这将增加虚拟内存大小。

    【讨论】:

    • 最简单的解决方案!
    【解决方案5】:

    您可以尝试创建弹出该错误的相同脚本,通过从外部脚本导入将脚本分成多个脚本。例如,hello.py 预计会出现错误内存错误,所以我将 hello.py 分成几个脚本 h.py e.py ll.py o.py 所有这些都必须进入文件夹“hello hello”进入该文件夹 create init.py 到 init 中写入 import h,e,ll,o 然后在 ide 中写入 import hellohello

    【讨论】:

      【解决方案6】:

      用这个输入检查程序:abc/if you got something like ab ac bc abc 程序运行良好,您需要更强大的 RAM,否则程序出错。

      【讨论】:

      • 请查看七年前接受的答案,以了解解决问题的原因以及解决类似问题的原因。仅仅因为程序处理少量数据而失败并处理更复杂的数据并不意味着程序“运行良好”或 OP 需要更多 RAM。正如现有答案中提到的,这可能是由 inefficient 代码引起的,或者甚至只是使用 32 位版本的解释器,这限制了 可用 RAM(独立于实际安装了多少),
      【解决方案7】:

      使用python 64位解决了很多问题。

      【讨论】:

      • 也许对其他用户来说说它为什么能解决问题会有用?
      猜你喜欢
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 2019-06-14
      • 2019-01-31
      • 2013-12-04
      • 2012-10-31
      • 2011-05-18
      • 1970-01-01
      相关资源
      最近更新 更多