我在一个特别大的输入集上运行我的Python longest common subsequence算法,将生成的LCS长度存储在一个二维numpy数组中。我注意到它随着时间的推移而减速;大约三分之一的时间,它慢慢爬行,然后崩溃,打印神秘的错误消息“pnc =:N”,之后没有换行符(我的程序在停止之前再打印一行输出)。此时它似乎还释放了大量已分配的内存。有谁知道这意味着什么?
编辑:崩溃的代码部分是:
#m and n are both around 12,000
lengths = np.empty((m+1, n+1), dtype=np.uint)
lengths[0,:] = 0
lengths[1:,0] = 0
if m > 0 and n > 0:
for i in xrange(1, m + 1):
for j in xrange(1, n + 1):
#eqTest is a function comparing two sequence elements, like cmp
eq = eqTest(a[i-1], b[j-1])
if eq:
lengths[i,j] = lengths[i-1,j-1] + 1
elif lengths[i-1,j] >= lengths[i,j-1]:
lengths[i,j] = lengths[i-1,j]
else:
lengths[i,j] = lengths[i,j-1]
由于整个LCS长度数组在开始时分配然后填充,我不确定是什么原因导致它减慢或使用更多资源。我正在使用的相等测试难以描述,因为它部分用C语言编写,但它有效:
def eqTest(l1, l2):
words1 = l1.split()
words2 = l2.split()
if len(words1) == len(words2):
for i in xrange(len(words1)):
#MATCHERS is a list of around 10 compiled regular expressions
for m in MATCHERS:
if m.match(s1) is not None and m.match(s2) is not None:
break
else:
result = False
break
else:
result = True
else:
result = False
return result
答案 0 :(得分:0)
如果“然后崩溃”意味着程序终止,那么“此时它似乎也释放了大量已分配的内存。”是操作系统回收分配给进程的内存的效果。
原因可能是您的程序超出了进程大小的操作系统限制(至少会导致Linux崩溃)。
至于其他任何内容,都会有助于查看您的代码。您总是发布您的代码。