我是 python 新手,正面临似乎是内存泄漏错误。我编写了一个简单的脚本,它试图从 postgres 数据库中获取多个列,然后继续对这些列执行简单的减法并将结果存储在一个正在写入文件的临时变量中。我需要对数据库中的多对列执行此操作,并且我正在使用列表列表来存储不同的列名。
我在这个列表的各个元素上循环,直到列表用完。虽然我得到了前几列对的有效结果(有效我的意思是输出文件包含预期值),但程序在执行之间的某个地方突然被“杀死”。下面的代码:
varList = [ ['table1', 'col1', 'col2'],
['table1', 'col3', 'col4'],
['table2', 'col1', 'col2'],
# ..
# and many more such lines
# ..
['table2', 'col3', 'col4']]
try:
conn = psycopg2.connect(database='somename', user='someuser', password='somepasswd')
c = conn.cursor()
for listVar in varList:
c.execute("SELECT %s FROM %s" %(listVar[1], listVar[0]))
rowsList1 = c.fetchall();
c.execute("SELECT %s FROM %s" %(listVar[2], listVar[0]))
rowsList2 = c.fetchall();
outfile = file('%s__%s' %(listVar[1], listVar[2]), 'w')
for i in range(0, len(rowsList1)):
if rowsList1[i][0] == None or rowsList2[i][0] == None:
timeDiff = -1
else:
timestamp1 = time.mktime(rowsList1[i][0].timetuple())
timestamp2 = time.mktime(rowsList2[i][0].timetuple())
timeDiff = timestamp2 - timestamp1
outfile.write(str(timeDiff) + '\n')
outfile.close();
del rowsList1, rowsList2
#numpy.savetxt('output.dat', column_stack(rows))
except psycopg2.DatabaseError, e:
print 'Error %s' % e
sys.exit(1)
finally:
if conn:
conn.close()
我最初的猜测是存在某种形式的内存泄漏,为了解决这个问题,我在两个大数组上添加了一个 del 语句,希望内存被正确收集。这一次,我得到了稍微好一点的输出(稍微好一点是指为 db 列对创建了更多的输出文件)。但是,在第 10 对或第 11 对列之后,我的程序又被“杀死”了。有人可以告诉我这里可能出了什么问题。有没有更好的方法来完成这项工作?任何帮助表示赞赏。
PS:我知道这是一个相当低效的实现,因为我循环了很多次,但我需要一些快速而肮脏的东西来证明概念。