Dear all,

There seems to be a memory leak in some code below, in at least versions
4.5 and 4.5.3. For example, if I call it with

sage: L = find_candidates_for_large_value(5000)

It prints something like:

current memory usage: 836.73046875
current memory usage: 836.73046875
current memory usage: 836.73046875
current memory usage: 836.73046875
current memory usage: 836.73046875
current memory usage: 836.73046875
current memory usage: 836.73046875
current memory usage: 836.98046875
current memory usage: 836.98046875
current memory usage: 836.98046875
current memory usage: 836.98046875
current memory usage: 836.98046875
current memory usage: 836.98046875
current memory usage: 836.98046875
current memory usage: 837.23046875
current memory usage: 837.23046875
current memory usage: 837.23046875
current memory usage: 837.23046875
current memory usage: 837.23046875
current memory usage: 837.23046875
current memory usage: 837.23046875
current memory usage: 837.23046875
current memory usage: 837.23046875
current memory usage: 837.48046875
current memory usage: 837.48046875
current memory usage: 837.48046875
current memory usage: 837.48046875
current memory usage: 837.48046875
current memory usage: 837.48046875
current memory usage: 837.48046875
current memory usage: 837.48046875
current memory usage: 837.48046875
current memory usage: 837.48046875
current memory usage: 837.73046875
current memory usage: 837.73046875
current memory usage: 837.73046875
current memory usage: 837.73046875
current memory usage: 837.73046875
current memory usage: 837.73046875
current memory usage: 837.73046875
current memory usage: 837.73046875
current memory usage: 837.73046875
current memory usage: 837.98046875
current memory usage: 837.98046875
current memory usage: 837.98046875
current memory usage: 837.98046875
current memory usage: 837.98046875
current memory usage: 837.98046875
current memory usage: 837.98046875
current memory usage: 837.98046875
current memory usage: 838.2578125
current memory usage: 838.2578125
current memory usage: 838.2578125
current memory usage: 838.2578125
current memory usage: 838.2578125
current memory usage: 838.515625
current memory usage: 838.515625
current memory usage: 838.515625
current memory usage: 838.515625
current memory usage: 838.81640625
current memory usage: 838.81640625
current memory usage: 838.81640625
current memory usage: 838.81640625
current memory usage: 838.81640625
current memory usage: 838.81640625
current memory usage: 838.81640625
current memory usage: 838.81640625
current memory usage: 838.81640625
current memory usage: 839.06640625
current memory usage: 839.06640625
current memory usage: 839.1953125
current memory usage: 839.1953125
current memory usage: 839.1953125
current memory usage: 839.1953125
current memory usage: 839.1953125
current memory usage: 839.1953125
current memory usage: 839.1953125
current memory usage: 839.453125
current memory usage: 839.453125
current memory usage: 839.453125
current memory usage: 839.6796875
current memory usage: 839.6796875
current memory usage: 839.6796875
current memory usage: 839.6796875
current memory usage: 839.6796875
current memory usage: 839.6796875
current memory usage: 839.6796875
current memory usage: 839.9375
current memory usage: 839.9375
current memory usage: 840.06640625
[...]


It is a little complicated, so we need a smaller example to figure out
what is causing the memory leak. Before I try making a smaller example,
I thought I would write here to see if anyone happens to know what is
leaking memory, or at least to see if anyone has a good guess.

Some things used are:

prime_range()
nth_prime()
symbolic arithmetic
fast_callable(domain=ComplexField(250))
ZZ.random_element()
RR.random_element()
copy(MatrixSpace(ZZ, n).zero())
A.LLL(), where A is a modification of the above copy(MatrixSpace(ZZ, n).zero())


import sys

def find_candidates_for_large_value(repeat=1):
    """
        Find values of t where zeta(1/2 + it) is expected to be big.
    """
    possible_t = []
    X = var('X')

    p_start = 20
    p_end = 40

    euler_product1 = 1
    euler_product2 = 1
    for p in prime_range(nth_prime(p_start) + 1):
        euler_product1 = euler_product1 / (1 - 1/p^(1/2 + i * X))

    euler_product2 = euler_product1

    for p in prime_range(nth_prime(p_start) + 1, nth_prime(p_end) + 1):
        euler_product2 = euler_product2 / (1 - 1/p^(1/2 + i * X))

    euler_product1 = fast_callable(euler_product1, domain=ComplexField(250), 
vars='X')
    euler_product2 = fast_callable(euler_product2, domain=ComplexField(250), 
vars='X')

    for l in xrange(repeat):
        n = ZZ.random_element(p_start, p_end)
        m = ZZ.random_element(120, 150)
        r = ZZ.random_element(40, 50)
        delta = RR.random_element(.9, .9999)

        last_prime = nth_prime(n)
        primes = prime_range(last_prime + 1)

        weights = [p^(-1/4) for p in primes]
        #print weights

        A = copy(MatrixSpace(ZZ, n+1).zero())
        for k in xrange(0, n):
            A[0,k] = floor(weights[k] * primes[k].log() * 2^(m - r))

        A[0,n] = 1

        for k in xrange(0, n):
            A[k + 1, k] = floor(2 * pi * weights[k] * 2^m)
        B = A.LLL(delta=delta)

        R = RealField(250)
        for k in xrange(0, n + 1):
            t = R(abs(B[n,k])/2^r)
            v1 = euler_product1(t)
            v2 = euler_product2(t)
            possible_t.append( (abs(v2), abs(v1), t, floor(abs(t)) - 20) )

        possible_t.sort()
        possible_t = possible_t[-10:]
        #print "On try number", l, " best candidates so far are"
        #for _ in possible_t[-10:]:
        #    print _
        print "current memory usage:", get_memory_usage()
        sys.stdout.flush()

    return possible_t

-- 
To post to this group, send an email to sage-devel@googlegroups.com
To unsubscribe from this group, send an email to 
sage-devel+unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/sage-devel
URL: http://www.sagemath.org

Reply via email to