Stefan van der Walt wrote:
On Wed, Nov 15, 2006 at 02:33:52PM -0600, Robert Kern wrote:
Mathew Yeates wrote:
Hi
I'm running a 64 bit Python 2.5 on an x86 with Solaris. I have a
function I call over 2^32 times and eventually I run out of memory.
The function is
def make_B(deltadates):
numcols=deltadates.shape[0]
B=numpy.zeros((numcols,numcols))
for ind in range(0,numcols): #comment out this loop and all is good
B[ind,0:numcols] = deltadates[0:numcols]
return B
If I comment out the loop lines, my memory is okay. I'm guessing that a
reference is being added to "deltadates" and that the reference count is
going above 2^32 and reseting. Anybody have any ideas about how I can
cure this? Is Numpy increasing the reference count here?
Can you give us a small but complete and self-contained script that demonstrates
the problem?
I think this might be related to ticket #378:
http://projects.scipy.org/scipy/numpy/ticket/378
Cheers
Stéfan
okay. attached is the smallest program I could make. Before running you
will need to create a file named biggie with 669009000 non zero floats.
Mathew
#program leaks memory on a 64 bit Python2.5 x86 Solaris
import numpy
import datetime
def make_B(deltadates):
numcols=deltadates.shape[0]
B=numpy.zeros((numcols,numcols))
for ind in range(0,numcols):
B[ind,0:numcols] = deltadates[0:numcols]
return B
def delta2day1(delta):
return delta.days/365.0
deltas2days=numpy.frompyfunc(delta2day1,1,1)
def get_connected_dates(numdates,data,all_dates,start_dates,
end_dates,refdate):
datecovered=numpy.array([False]*numdates)
for ind in range(0,data.shape[0]):
if data[ind] != 0:
starti=all_dates.index(start_dates[ind])
endi=all_dates.index(end_dates[ind])
datecovered[starti:endi+1] = True
refi=all_dates.index(refdate)
if not datecovered[refi]:
return False
after_list = refi + numpy.where(numpy.logical_and.accumulate(
datecovered[refi:] != False))[0]
reversei= numdates - refi
before_list = refi -1 - numpy.where(numpy.logical_and.accumulate(
datecovered[::-1][reversei:] != False))[0]
before_list.sort()
contig=numpy.concatenate((before_list,after_list),axis=1)
usedates=numpy.array(all_dates)[contig]
return usedates,contig
datasize=5529000
cols=45
iterlist=range(0,datasize)
curpercent=-2
filecount=121
refdate=datetime.date(1996, 4, 6)
numdates=46
all_dates=[datetime.date(1992, 8, 26), datetime.date(1993, 4, 28),
datetime.date(1993, 10, 20), datetime.date(1995, 4, 21), datetime.date(1995, 5,
26), datetime.date(1995, 6, 30), datetime.date(1995, 8, 4), datetime.date(1995,
9, 8), datetime.date(1995, 10, 13), datetime.date(1995, 11, 18),
datetime.date(1995, 12, 22), datetime.date(1995, 12, 23), datetime.date(1996,
1, 26), datetime.date(1996, 1, 27), datetime.date(1996, 4, 5),
datetime.date(1996, 4, 6), datetime.date(1996, 5, 11), datetime.date(1996, 6,
15), datetime.date(1996, 8, 24), datetime.date(1996, 9, 28),
datetime.date(1997, 1, 11), datetime.date(1997, 4, 26), datetime.date(1997, 9,
13), datetime.date(1997, 10, 18), datetime.date(1997, 11, 22),
datetime.date(1998, 1, 31), datetime.date(1998, 3, 7), datetime.date(1998, 4,
11), datetime.date(1998, 5, 16), datetime.date(1998, 6, 20),
datetime.date(1998, 7, 25), datetime.date(1998, 8, 29), datetime.date(1998, 10,
3), datetime.date(1998, 11, 7), datetime.date(1998, 12, 12),
datetime.date(1999, 1, 16), datetime.date(1999, 5, 1), datetime.date(1999, 6,
5), datetime.date(1999, 10, 23), datetime.date(1999, 11, 27),
datetime.date(2000, 2, 5), datetime.date(2000, 3, 11), datetime.date(2000, 4,
15), datetime.date(2000, 5, 20), datetime.date(2000, 6, 24),
datetime.date(2000, 11, 11)]
start_dates=[datetime.date(1992, 8, 26), datetime.date(1992, 8, 26),
datetime.date(1992, 8, 26), datetime.date(1993, 4, 28), datetime.date(1993, 4,
28), datetime.date(1993, 10, 20), datetime.date(1995, 4, 21),
datetime.date(1995, 4, 21), datetime.date(1995, 5, 26), datetime.date(1995, 5,
26), datetime.date(1995, 8, 4), datetime.date(1995, 8, 4), datetime.date(1995,
10, 13), datetime.date(1995, 12, 22), datetime.date(1995, 12, 23),
datetime.date(1995, 12, 23), datetime.date(1995, 12, 23), datetime.date(1996,
1, 26), datetime.date(1996, 4, 6), datetime.date(1996, 5, 11),
datetime.date(1996, 8, 24), datetime.date(1996, 9, 28), datetime.date(1997, 1,
11), datetime.date(1997, 1, 11), datetime.date(1997, 4, 26),
datetime.date(1997, 9, 13), datetime.date(1997, 9, 13), datetime.date(1997, 11,
22), datetime.date(1997, 11, 22), datetime.date(1997, 11, 22),
datetime.date(1998, 5, 16), datetime.date(1998, 5, 16), datetime.date(1998, 5,
16), datetime.date(1998, 6, 20), datetime.date(1998, 6, 20),
datetime.date(1998, 7, 25), datetime.date(1998, 10, 3), datetime.date(1998, 12,
12), datetime.date(1999, 1, 16), datetime.date(1999, 1, 16),
datetime.date(1999, 6, 5), datetime.date(1999, 10, 23), datetime.date(1995, 4,
21), datetime.date(1996, 9, 28), datetime.date(1998, 1, 31),
datetime.date(1998, 4, 11), datetime.date(1998, 7, 25), datetime.date(1996, 6,
15), datetime.date(1996, 9, 28), datetime.date(1997, 4, 26),
datetime.date(1998, 4, 11), datetime.date(1998, 7, 25), datetime.date(1997, 1,
11), datetime.date(1997, 9, 13), datetime.date(1998, 1, 31),
datetime.date(1998, 4, 11), datetime.date(1998, 10, 3), datetime.date(1996, 8,
24), datetime.date(1998, 3, 7), datetime.date(1997, 9, 13), datetime.date(1997,
10, 18), datetime.date(1998, 1, 31), datetime.date(1992, 8, 26),
datetime.date(1993, 4, 28), datetime.date(1993, 10, 20), datetime.date(1995, 6,
30), datetime.date(1995, 6, 30), datetime.date(1995, 8, 4), datetime.date(1995,
8, 4), datetime.date(1995, 9, 8), datetime.date(1995, 9, 8),
datetime.date(1995, 10, 13), datetime.date(1995, 12, 22), datetime.date(1995,
12, 23), datetime.date(1996, 1, 26), datetime.date(1996, 1, 27),
datetime.date(1996, 4, 6), datetime.date(1996, 5, 11), datetime.date(1996, 6,
15), datetime.date(1996, 6, 15), datetime.date(1996, 6, 15),
datetime.date(1996, 8, 24), datetime.date(1996, 9, 28), datetime.date(1997, 1,
11), datetime.date(1997, 1, 11), datetime.date(1997, 4, 26),
datetime.date(1997, 10, 18), datetime.date(1998, 4, 11), datetime.date(1998, 4,
11), datetime.date(1998, 4, 11), datetime.date(1998, 7, 25),
datetime.date(1998, 7, 25), datetime.date(1998, 7, 25), datetime.date(1999, 1,
16), datetime.date(1999, 5, 1), datetime.date(1999, 5, 1), datetime.date(1995,
4, 21), datetime.date(1995, 10, 13), datetime.date(1995, 12, 22),
datetime.date(1996, 1, 26), datetime.date(1996, 1, 26), datetime.date(1996, 1,
26), datetime.date(1996, 4, 5), datetime.date(1996, 4, 5), datetime.date(1996,
4, 6), datetime.date(1996, 4, 6), datetime.date(1996, 5, 11),
datetime.date(1996, 5, 11), datetime.date(1996, 6, 15), datetime.date(1996, 9,
28), datetime.date(1998, 1, 31), datetime.date(1998, 1, 31),
datetime.date(1999, 10, 23), datetime.date(1999, 10, 23), datetime.date(2000,
4, 15), datetime.date(2000, 2, 5), datetime.date(2000, 2, 5),
datetime.date(1998, 3, 7), datetime.date(1995, 11, 18), datetime.date(1998, 8,
29), datetime.date(1995, 12, 22)]
end_dates=[datetime.date(1995, 8, 4), datetime.date(1996, 1, 27),
datetime.date(1996, 4, 5), datetime.date(1995, 10, 13), datetime.date(1995, 12,
22), datetime.date(1995, 10, 13), datetime.date(1995, 5, 26),
datetime.date(1996, 4, 5), datetime.date(1996, 4, 5), datetime.date(1996, 4,
6), datetime.date(1996, 1, 26), datetime.date(1996, 1, 27), datetime.date(1998,
11, 7), datetime.date(1998, 10, 3), datetime.date(1996, 1, 27),
datetime.date(1996, 5, 11), datetime.date(1997, 11, 22), datetime.date(1996, 1,
27), datetime.date(2000, 2, 5), datetime.date(1997, 11, 22),
datetime.date(1998, 3, 7), datetime.date(2000, 4, 15), datetime.date(2000, 11,
11), datetime.date(1997, 9, 13), datetime.date(1998, 3, 7), datetime.date(1997,
10, 18), datetime.date(1998, 8, 29), datetime.date(2000, 5, 20),
datetime.date(1998, 6, 20), datetime.date(1998, 8, 29), datetime.date(2000, 5,
20), datetime.date(1998, 6, 20), datetime.date(1999, 6, 5), datetime.date(2000,
5, 20), datetime.date(1999, 6, 5), datetime.date(1999, 5, 1),
datetime.date(1999, 6, 5), datetime.date(2000, 6, 24), datetime.date(1999, 5,
1), datetime.date(1999, 10, 23), datetime.date(2000, 5, 20),
datetime.date(1999, 11, 27), datetime.date(1996, 4, 6), datetime.date(2000, 2,
5), datetime.date(2000, 2, 5), datetime.date(2000, 2, 5), datetime.date(2000,
2, 5), datetime.date(2000, 3, 11), datetime.date(2000, 3, 11),
datetime.date(2000, 3, 11), datetime.date(2000, 3, 11), datetime.date(2000, 3,
11), datetime.date(2000, 4, 15), datetime.date(2000, 4, 15),
datetime.date(2000, 4, 15), datetime.date(2000, 4, 15), datetime.date(2000, 5,
20), datetime.date(2000, 6, 24), datetime.date(2000, 6, 24),
datetime.date(2000, 11, 11), datetime.date(2000, 11, 11), datetime.date(2000,
11, 11), datetime.date(1996, 1, 26), datetime.date(1993, 10, 20),
datetime.date(1995, 12, 22), datetime.date(1995, 9, 8), datetime.date(1998, 12,
12), datetime.date(1995, 12, 23), datetime.date(1996, 5, 11),
datetime.date(1995, 11, 18), datetime.date(1998, 12, 12), datetime.date(1998,
10, 3), datetime.date(1999, 6, 5), datetime.date(1998, 5, 16),
datetime.date(1996, 4, 5), datetime.date(1996, 5, 11), datetime.date(1996, 9,
28), datetime.date(1998, 5, 16), datetime.date(1997, 4, 26),
datetime.date(1998, 3, 7), datetime.date(1998, 4, 11), datetime.date(1998, 12,
12), datetime.date(1998, 1, 31), datetime.date(1997, 10, 18),
datetime.date(1998, 8, 29), datetime.date(1998, 4, 11), datetime.date(1998, 8,
29), datetime.date(1999, 1, 16), datetime.date(1999, 5, 1), datetime.date(1999,
11, 27), datetime.date(1999, 1, 16), datetime.date(1999, 10, 23),
datetime.date(1999, 11, 27), datetime.date(1999, 11, 27), datetime.date(1999,
10, 23), datetime.date(1999, 11, 27), datetime.date(1996, 9, 28),
datetime.date(1995, 12, 22), datetime.date(1996, 5, 11), datetime.date(1997,
10, 18), datetime.date(1997, 11, 22), datetime.date(1998, 8, 29),
datetime.date(1996, 4, 6), datetime.date(1997, 1, 11), datetime.date(1997, 1,
11), datetime.date(1998, 1, 31), datetime.date(1998, 10, 3),
datetime.date(1999, 6, 5), datetime.date(1996, 9, 28), datetime.date(1997, 4,
26), datetime.date(1998, 4, 11), datetime.date(1998, 7, 25),
datetime.date(2000, 11, 11), datetime.date(2000, 4, 15), datetime.date(2000,
11, 11), datetime.date(2000, 4, 15), datetime.date(2000, 3, 11),
datetime.date(2000, 3, 11), datetime.date(1998, 12, 12), datetime.date(2000,
11, 11), datetime.date(1998, 6, 20)]
#biggie is a file with 669009000 floats. The values are unimportant as long as
they are not 0
diff_phases=numpy.memmap("biggie",mode="r+",
shape=(datasize,filecount),dtype=numpy.float32)
for row in iterlist:
data = diff_phases[row,:]
data=numpy.nan_to_num(data) #set Nans to zero
if len(data[numpy.where(data != 0)]) == 0: continue #no good data
res=get_connected_dates(numdates,data,all_dates,start_dates,
end_dates,refdate)
if not res: continue
usedates,contig=res
if usedates.shape[0] == 0:continue
deltadates=usedates[1:] - usedates[:-1]
deltadates=deltas2days(deltadates)
B = make_B(deltadates)
percent=(100.0 * row)/datasize
if percent >= curpercent + 1:
print "%f percent done" % percent
curpercent=percent
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Numpy-discussion mailing list
Numpy-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/numpy-discussion