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()
这里的这个:
似乎是非常低效和昂贵的大字符串。
最好这样做
缓冲区对象保留对原始字符串、开始和长度属性的引用。这样,就不会发生不必要的重复数据。
长度为
l
的字符串具有平均长度为l/2
的l*l/2
子字符串,因此内存消耗大致为l*l*l/4
。有了缓冲区,它就小得多了。请注意,
buffer()
只存在于2.x中。3.x有memoryview()
,使用略有不同。更好的方法是计算索引并根据需要删除子字符串。
memory error表示程序内存不足。这意味着你的程序以某种方式创建了太多的对象。
在您的示例中,您必须查找算法中可能消耗大量内存的部分。我怀疑你的程序被赋予了很长的字符串作为输入。因此,
s[i:j+1]
可能是罪魁祸首,因为它创建了一个新列表。但是,第一次使用它时,并不需要,因为您不使用创建的列表。您可以尝试查看以下内容是否有帮助:要替换第二个列表创建,必须使用buffer对象,如glglgl所建议的那样。
还要注意,由于使用
if j >= i:
,因此不需要在0开始xrange
。你可以有:一个更激进的选择是尝试重新设计算法,这样就不会预先计算所有可能的子字符串。相反,您可以简单地计算所请求的子字符串。
如果您得到一个意外的
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
相关问题 更多 >
编程相关推荐