尽管还有0.5 GB RAM,但Python中的内存错误

时间:2015-04-25 17:03:17

标签: python memory memory-management

我在Python程序中使用了Eratosthenes的Sieve来找到素数因子。这是代码 -

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被完全利用之前发生这种内存错误。

2 个答案:

答案 0 :(得分:0)

Check here

  

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

答案 1 :(得分:0)

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