3

私は、flask-sqlalchemy を使用して MySQL データベースからデータを取得する単純な Web アプリを作成しています (現在、2 つのテーブルに 64000 を超えるフィールドがあり、増加しています)。私は 1 つのインスタンスしか実行していませんでしたが、RAM が不足して動作が停止するまで何の問題もありませんでした。気付いた

RAMを追加し続けることができないため、この全体がどのように機能するかを再考する必要があるかもしれません(これは小さな仮想マシンなので、512から768 MBに増えていますが、それでも)...しかし、Pythonは処理後にメモリを解放する必要がありますリクエストで?実際、私の Windows マシンで同じフラスコ アプリを実行すると、RAM を消費し (ただし半分だけです!)、完了すると解放されます。多くの(おそらく)小さなアプリを実行するDebianマシンではそうではありません。私の知る限り、両方のマシンで実行されている lib バージョンは同じです。Debian マシンには、Windows マシンよりも新しいバージョンの Python さえあります。どちらも同じデータベースに接続しています。続行するにはどうすればよいですか?

from flask import Flask, request, jsonify
from flask.ext.sqlalchemy import SQLAlchemy

import re
from datetime import datetime

app = Flask(__name__)
app.config.from_pyfile('settings.cfg')
db = SQLAlchemy(app)

class Reports(db.Model):
    __tablename__ = 'reports'

    id          = db.Column(db.Integer, primary_key=True)
    ip          = db.Column(db.Integer)
    date        = db.Column(db.DateTime)
    sid         = db.Column(db.Integer)
    version     = db.Column(db.Integer)
    itemname    = db.Column(db.String(25))
    group       = db.Column(db.Integer)
    pclass      = db.Column(db.String(15))
    ltime       = db.Column(db.Integer)
    rlen        = db.Column(db.Integer)
    total       = db.Column(db.Integer)

    def __init__(self, pd):
        self.date = datetime.utcnow()
        self.sid = pd["sid"]
        self.version = pd["version"]
        self.itemname = pd["itemname"]
        self.group = pd["group"]
        self.pclass = pd["pclass"]
        self.ltime = pd["ltime"]
        self.rlen = pd["rlen"]
        self.total = pd["total"]


class Perfdata(db.Model):
    __tablename__ = 'perfdata'

    reportid    = db.Column(db.Integer, db.ForeignKey('reports.id'), primary_key=True)
    l70 = db.Column(db.Integer)
    l65 = db.Column(db.Integer)
    l60 = db.Column(db.Integer)
    l55 = db.Column(db.Integer)
    l50 = db.Column(db.Integer)
    l45 = db.Column(db.Integer)
    l40 = db.Column(db.Integer)
    l35 = db.Column(db.Integer)
    l30 = db.Column(db.Integer)

    def __init__(self, reportid, pd):
        self.reportid = reportid
        self.l70 = pd["l70"]
        self.l65 = pd["l65"]
        self.l60 = pd["l60"]
        self.l55 = pd["l55"]
        self.l50 = pd["l50"]
        self.l45 = pd["l45"]
        self.l40 = pd["l40"]
        self.l35 = pd["l35"]
        self.l30 = pd["l30"]

    def buildlist(self):
        plist = []

        plist.append(self.l70)
        plist.append(self.l65)
        plist.append(self.l60)
        plist.append(self.l55)
        plist.append(self.l50)
        plist.append(self.l45)
        plist.append(self.l40)
        plist.append(self.l35)
        plist.append(self.l30)

        return plist


@app.route('/ps', methods=['GET'])
def perfget():

    response = []

    for report, perf in db.session.query(Reports, Perfdata).all():

        response.append("")

        response.append("%s %s %s %s %s %s %s %s" % (report.version,
                                                     report.sid,
                                                     report.itemname,
                                                     report.group,
                                                     report.pclass,
                                                     report.ltime,
                                                     report.rlen,
                                                     report.total))

        response.append("%s %s %s %s %s %s %s %s %s" % (perf.l70,
                                                     perf.l65,
                                                     perf.l60,
                                                     perf.l55,
                                                     perf.l50,
                                                     perf.l45,
                                                     perf.l40,
                                                     perf.l35,
                                                     perf.l30))

    return '<br>\n'.join(response)


if __name__ == '__main__':
    app.run()
4

1 に答える 1