为什么在sqlite中:memory:这么慢?
我一直在尝试查看通过使用内存中的sqlite与基于磁盘的sqlite是否可以获得任何性能改进。 基本上,我想以启动时间和内存为代价来获得非常快速的查询,这些查询在应用程序过程中不会对磁盘造成影响。
但是,以下基准测试仅能使我提高速度1.5倍。 在这里,我正在生成一百万行随机数据,并将其加载到同一表的基于磁盘和内存的版本中。 然后,我在两个数据库上运行随机查询,返回大小约为300k的集合。 我期望基于内存的版本会更快,但是如上所述,我的速度只有1.5倍。
我尝试了其他几种大小的数据库和查询集。 :memory:的优势似乎随着数据库中行数的增加而上升。 我不确定为什么优势如此之小,尽管我有一些假设:
所使用的表不够大(行)不足以构成:内存:一个巨大的赢家
更多的联接/表将使:memory:优势更加明显
在连接或操作系统级别进行某种缓存,以便以某种方式可以访问以前的结果,从而破坏了基准
我没有看到某种隐藏的磁盘访问(我还没有尝试过lsof,但是我确实关闭了PRAGMA的日志功能)
我在这里做错什么了吗? 为什么:memory:没有产生几乎即时的查询? 这是基准:
==> sqlite_memory_vs_disk_benchmark.py <==
#!/usr/bin/env python
"""Attempt to see whether :memory: offers significant performance benefits.
"""
import os
import time
import sqlite3
import numpy as np
def load_mat(conn,mat):
c = conn.cursor()
#Try to avoid hitting disk, trading safety for speed.</