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