3

私はPyQt4アプリケーションに取り組んでおり、メモリリークがあるように見えることを除いて、ほぼ完了しています。全体のコードはかなり長いので、ここにすべてを投稿することはしません。Python Memory Validator というツールを使用して、アプリケーションのメモリ割り当てを追跡しています。プログラムが初期化された後もインスタンス数が増加し続けるクラスは、特にイテレータ、特にdictionary-keyiteratorlistiteratortupleiterator. これらに加えて、インスタンス数が増加し続けている他のクラスはPyCapsulemethod-wrapper.

zip()イテレータが割り当てられている場所を調査しましたが、関数を使用するたびに少なくともタプルイテレータがインスタンス化され、削除されることはないようです。これは正常な動作ですか、それともこれらの反復子がメモリ リークの原因である可能性がありますか? もしそうなら、回避策はありますか?

また、PyCapsules とメソッド ラッパーがインスタンス化された場所を調査しましたが、どちらも次のコードを使用してメソッドから作成され、削除されていないようです。

def importXml(self, fh):
    error = None
    try:
        handler = SaxSensorDataHandler(self)
        parser = QXmlSimpleReader()
        parser.setContentHandler(handler)
        parser.setErrorHandler(handler)
        input_ = QXmlInputSource(fh)
        self.new = True
        if not parser.parse(input_):
            if handler.errorLine == 4:
                self.new = False
            else:
                raise ValueError
    except (IOError, OSError, ValueError), e:
        error = "Failed to import file: %s" % e
    finally:
        if fh is not None:
            fh.close()
        if error is not None:
            return False, error
        if len(self.__sensors) == 0:
            return False, "Discovered no sensors connected to %s. Please check sensor connections and try again." % fh.url().host()
        self.__dirty = True
        return True, 'Discovered %d sensors connected to %s. Please press "Start" to begin taking measurements.' %(len(self.__sensors), fh.url().host())

SaxSensorDataHandlerこれは主に、再実装されたストック PyQt クラスをインスタンス化して使用することで構成され、再実装さQXmlDefaultHandlerれたメソッドは、XML タグの読み取り中に XML ハンドラーによって呼び出されるメソッドのみです。これらのメソッドで行っているのは、取得した情報を変数に割り当て、コンテナー内の対応する変数を更新する別のメソッドを呼び出すことだけなので、メモリ リークが発生することはありません。メモリ リークは、PyQt4 の Xml ハンドラ クラスの既知の問題が原因である可能性がありますか?

助けてくれてありがとう!

4

1 に答える 1

0

gc モジュールを使用してみてください。リークしているプログラム呼び出しをデバッグするgc.set_debug(gc.DEBUG_LEAK)には、 でデバッグ出力を取得しますsys.stderr

于 2012-09-01T21:52:15.803 に答える