python中的内存错误

新手上路,请多包涵
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()

原文由 sachin irukula 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 295
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)

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

A string of length l has l*l/2 sub strings of average length l/2 , so the memory consumption would roughly be l*l*l/4 .有了缓冲区,它就小了很多。

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

更好的方法是计算索引并按需剪切子字符串。

原文由 glglgl 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您遇到意外的 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- 限制为 4gb 内存

原文由 mgoldwasser 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏