使用Python3的pysqlite

时间:2017-11-03 07:36:15

标签: python sqlite pysqlite

我有一个Python程序每秒收集监控数据。数据将缓存在SQLite数据库中以便以后传输。数据库方案:unix_timestamp整数,device_id文本,s0整数,s1整数,...,s99整数。并创建了'unix_timestamp'列的索引。 s0-s99的整数值将在0-65535范围内。最大缓冲区大小是4周数据,对应于数据库中的大约250万行。最终,将有三个进程访问数据库:数据收集器,删除以保持最大。缓冲区大小到最近4周,数据传输。

关注数据库交互的锁定和超时我试图在具有512MB RAM,1GHZ RISC armv7架构的设备上进行某种分析(选择,删除,插入)。

使用最大值填充数据库(见上文)使用pysqlite和以下代码块记录时间:

start = time.time()
c = conn.cursor()
c.execute(...)/executemany(...)
c.commit()
end=time.time() 

结果如下:

  • 删除60s范围(DELETE FROM测量WHERE时间戳> = ? AND时间戳< ?):最大。 0.872s,分钟。 0.094s
  • 插入60s范围(INSERT INTO测量(...)VALUES(...)“;'executemany'功能):0.079 - 0.111s
  • 选择60s范围(SELECT timestamp,device_id,s0,...,s99 FROM测量WHERE时间戳> =?和timestamp<?ORDER BY timestamp):0.031-0.034s

所以我在这里有几个问题:

  1. 根据您的经验/您的猜测:这些时间是在上述方案的预期范围内,还是可以的 加速使用其他数据库设置/另一个Python SQLite库?
  2. 是否可以猜测瓶颈,以便寻找具有更高读/写速率的SD卡?
  3. 记录的时间变化很大(例如,上面详细说明的插入可能会不时地占用大约1秒):这是由于加载数据库页面 进入RAM与使用缓存页面或如何解释?
  4. 据推测,数据库写入过程的锁定将比我的时间短(参见SQLite的解析和代码生成):是否存在 某事。就像一个经验法则,锁定持续时间与总体时间的比率 SQLite lib?
  5. 我尝试使用'PRAGMA journal_mode = WAL;'同样。这加快了写入过程(插入,删除)。但我不确定是否这样 如果我的进程与数据库交互运行不同,将会有效 码头工人集装箱。 docs on WAL州:'......使用共享 内存意味着所有读者必须存在于同一台机器上。这个 这就是为什么预写日志实现不适用于网络 文件系统'。这是否意味着在不同的docker中运行进程 容器也会出问题吗?

0 个答案:

没有答案