繁体   English   中英

尽管剩余0.5 GB RAM,但Python中的内存错误

[英]Memory Error in Python despite 0.5 GB RAM left

我在Python程序中使用Eratosthenes筛子来查找主要因素。 这是代码-

import time
import sys

p=[]

def sieve(n):
    p.append(False)   # 0 isn't prime
    p.append(False)   # 1 isn't prime
    i=2
    while (i<=n):
        if i%2==0:
            p.append(False)
       else:
            p.append(True)
       i+=1
    #creating a sieve and putting even numbers as false and odd as true
    #Even numbers can never be prime except 2 which will now become true

    p[2]=True

    sq=int(n**0.5)  #storing square root of n
    i=3
    while (i<=sq):
        k=i*i
        while k<=n:
            p[k]=False
            k+=(2*i) 
        i+=2

def primefactors(n,x):
    print "The prime factors are : "
    if(n%2==0):
        print 2
        while(n%2==0):
            n/=2
    i=3
    while(i<len(p)):
        if(n==1):
            break 
        if(p[i]):
           if(n%i==0):
               print i
               while(n%i==0):
                    n/=i
        i+=2
    if n==x:
        print None
    elif n!=1:
        print n

def main ():
    print "Enter number to be factored "
    n=raw_input()
    n=int(n)
    start=time.clock()
    sieve(n**0.5+1)
    primefactors(n,n)
    end=time.clock()
    print "Seconds : "+str(end-start)

main()

现在,当我尝试分解18位数字时,在创建列表时收到内存错误。 但是,Windows任务管理器显示仅使用了1.48 GB RAM,而我有大约2.2 GB可用RAM。 这背后的原因是什么?

发生内存错误时,我添加了任务管理器的屏幕截图。(目前无法发布图像,因此此处是链接-Image

另外,我知道还有其他方法可以更快地分解素数,但是我只想知道为什么在完全利用RAM之前发生这种内存错误。

在这里检查

因此,在32位系统上,python列表的最大大小为536,870,912个元素。

python正在为您的列表保留连续空间。 如果您的列表已增加到保留空间,则python会分配更大的空间,并将您的元素复制到新位置。 当您的列表已增加到可用内存的一半时,此大小调整最后一次失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM