Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在烧瓶或瓶子应用程序中高效提交DB更改?_Python_Sqlite_Flask_Commit_Bottle - Fatal编程技术网

Python 如何在烧瓶或瓶子应用程序中高效提交DB更改?

Python 如何在烧瓶或瓶子应用程序中高效提交DB更改?,python,sqlite,flask,commit,bottle,Python,Sqlite,Flask,Commit,Bottle,我注意到,在我的小型数据库中,SQLitedb.commit()(保存到磁盘)需要50到100毫秒的时间。这是正常的,但是在客户每次请求后/每次插入后这样做太多了: import bottle, sqlite3, random @bottle.route('/') def index(): c = db.cursor() c.execute('INSERT INTO test VALUES (?)', (random.randint(0, 10000))) c.clos

我注意到,在我的小型数据库中,SQLite
db.commit()
(保存到磁盘)需要50到100毫秒的时间。这是正常的,但是在客户每次请求后/每次插入后这样做太多了

import bottle, sqlite3, random

@bottle.route('/')
def index():
    c = db.cursor()
    c.execute('INSERT INTO test VALUES (?)', (random.randint(0, 10000)))
    c.close()
    db.commit()    # should we do it here? (100ms is too much after *each* request!)
    return 'hello'

def worker():      
    db.commit()    # or here? how to call this worker once every 10 seconds? 

db = sqlite3.connect('test.db')
db.execute("CREATE TABLE IF NOT EXISTS test (a int)")
bottle.run(port=80)
更确切地说,我不想在每次请求后丢失100毫秒:我优化了我的服务器,使其能够以非常快的速度(10毫秒)提供页面,如果因为DB提交而丢失100毫秒,那将是一种耻辱

当然,我可以每10秒启动一个新线程调用
worker()
(在最坏的情况下,如果应用程序崩溃,只会丢失最后10秒的数据库)。但我读到它不推荐使用

问题:如何在瓶子/烧瓶Web服务器上下文中仅每隔几秒钟提交一次SQLite DB(而不是每次插入后提交一次)?您可以编写一个烧瓶处理程序并在那里提交数据库。您甚至可以限制仅在上次提交后经过一定时间后才执行此操作


这不会阻止您的请求,也不会太频繁地保存文件。

下面是一个尝试。如果在此时间段内有插入,则仅每10秒提交一次

注意:它需要
检查\u same\u thread=False
,如中所述


但如中所述,在执行前面的代码之前,还有一些其他选项值得尝试,例如:

c.execute('PRAGMA synchronous = OFF')
c.execute('PRAGMA journal_mode = OFF')
这至少可以将性能提高一个数量级

有用资源:


这种方法很有趣,但也有一些缺点。示例:请求#100(DB commit),请求#101(没有DB commit,因为DB commit已经在1秒前完成了),然后等待30秒,服务器停止(
app.py
被终止或使用CTRL+C停止)。那么请求#101的插入是。。。迷路的有什么想法吗?
我不想在每次请求后丢失100毫秒
-为什么不?很少有域真正对延迟敏感——特别是在写操作上。你的webapp是极为罕见的案例之一吗?(高频交易、实时竞价等)@ronrothman我所处的情况是,许多客户可能会在同一时间连接(为了一个精确的事件),我知道通常情况并非如此,通常用户每天24小时分布,但他们来这里是为了一个特定的事件,有一个精确的开始时间。然后(如果我理解正确的话)您需要的是高吞吐量,而不是低延迟。您应该考虑增加并发性,而不是减少延迟。@ronrothman两者都很好:每次请求提交到磁盘时不损失100毫秒(而(复杂!)页面在不到20毫秒或30毫秒的时间内生成),还可以提高并发性。将每个请求的时间乘以一个因子x6来记录某些内容是我们不希望看到的,因此我想分析如何避免这种情况。(页面生成只需几毫秒,而仅一个小的DB日志提交就需要6倍的时间,这不是很遗憾吗?)我想有些事情必须经过艰苦的学习。:)我强烈建议你不要再担心100米了。祝你好运我完全接受否决票(当答案不好时,否决票是有用的);如果下议院的选民能就问题发表评论,那将非常有用/有益,而且对我也会有帮助。提前谢谢!
c.execute('PRAGMA synchronous = OFF')
c.execute('PRAGMA journal_mode = OFF')