1

私は、Python の最長共通サブシーケンスアルゴリズムを特に大規模な入力セットに対して実行し、結果の LCS の長さを 2 次元の numpy 配列に格納していました。時間の経過とともに速度が低下していることに気付きました。約 3 分の 1 で、クロールに速度が低下し、その後クラッシュして、不可解なエラー メッセージ「pnc=: N」が出力され、その後に改行がありませんでした (私のプログラムは、停止する前にもう 1 行の出力を出力しました)。また、この時点でかなりの量の割り当てられたメモリが解放されたようです。これが何を意味するのか誰にも分かりませんか?

編集: クラッシュしたコードの部分は次のとおりです。

#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 に答える