1

我在一个特别大的输入集上运行我的 Python最长公共子序列算法,将生成的 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
4

1 回答 1

0

如果“然后崩溃”意味着程序终止,那么“此时它似乎也释放了大量分配的内存”。是操作系统回收分配给进程的内存的效果。

根据您的描述,原因可能是您的程序超出了操作系统对进程大小的限制(至少会导致 Linux 崩溃)。

至于更多,这将有助于查看您的代码。您应该始终发布您的代码。

于 2012-12-19T18:20:18.227 回答