2

私のプログラムは、数秒ごとにメガバイトを消費しています。私はPythonがガベージコレクションでcurorsを認識しないことを読んだので、私の使用に何か問題があり、どこかでpydbc何かsqlalchemyを閉じていないのではないかと感じていますか?

#Set up SQL Connection
def connect():
        conn_string = 'DRIVER={FreeTDS};Server=...;Database=...;UID=...;PWD=...'
        return pyodbc.connect(conn_string)

metadata = MetaData()
e = create_engine('mssql://', creator=connect)
c = e.connect()
metadata.bind = c
log_table = Table('Log', metadata, autoload=True)

...
atexit.register(cleanup)
#Core Loop
line_c = 0
inserts = []
insert_size = 2000
while True:
        #line = sys.stdin.readline()
        line = reader.readline()
        line_c +=1
        m = line_regex.match(line)
        if m:  
                fields = m.groupdict()
                ...
                inserts.append(fields)
                if line_c >= insert_size:
                        c.execute(log_table.insert(), inserts)
                        line_c = 0
                        inserts = []

メタデータブロックまたはその一部を挿入ブロックに移動し、挿入ごとに接続を閉じる必要がありますか?

編集:
Q:それはすべて安定していますか? ここに画像の説明を入力

A: プロセスを吹き飛ばす Linux を数えた場合のみ :-) (グラフはメモリ使用量からバッファ/キャッシュを除外しています)

4

1 に答える 1

1

私は必ずしも SQLAlchemy を責めるつもりはありません。また、下層のドライバーの問題である可能性もあります。一般に、メモリ リークは検出が困難です。いずれにせよ、コア開発者の Michael Bayer がほぼすべての質問に回答している SQLALchemy メーリング リストで質問する必要があります...おそらく、本当の助けが得られる可能性が高くなります...

于 2011-04-05T13:57:55.307 に答える