我需要将10个传感器的同步读数存储在大约100Hz的SQLite数据库中。这意味着我需要每秒将大约1000个读数存储到数据库中。
我已经尝试将数据库插入方法放在一个在自己的进程中运行的服务中,但我只能收集大约3.5秒的数据。我认为该服务正在被杀害。
我没有使用数据库事务来插入数据。只需单独调用INSERT INTO ...使用事务是否至关重要?
是否有必要在单独的进程中运行数据库插入?我可以在主进程的新线程中运行它们吗?
如果需要,我可以提供代码。
答案 0 :(得分:4)
您需要使用事务,并通过在同一事务中执行多个插入来“分块”您的请求。你必须使用插入的数量,但我会从每个事务1000个插入开始,并从那里调整它。
如果要一次插入一条记录,则交易速度极慢。原因是SQLite在完成事务之前等待数据写入磁盘,因此必须等待磁盘盘片完全旋转,在此期间磁盘基本上处于非活动状态。
在7200 RPM硬盘上,这实质上将事务限制为每秒60次。
答案 1 :(得分:0)
我需要将10个传感器的同步读数存储在大约100Hz的SQLite数据库中
如果您指的是Android的传感器,我很不确定您是否会快速将数据传送给您。
我已经尝试将数据库插入方法放在一个在自己的进程中运行的服务中
不要使用单独的流程。你正在增加开销,没有任何好处。
从您的传感器注册的任何组件中进行数据库I / O.如果这是一项服务,那很好。
我只能收集大约3.5秒的数据。我认为该服务当时正在被杀。
然后你有更大的问题。包含正在运行的服务的进程在启动后3.5秒内不会被杀死。不知何故,你的服务实现搞砸了。
我没有使用数据库事务来插入数据
哈维先生指出,交易对绩效至关重要。
使用交易至关重要吗?
是
是否有必要在单独的进程中运行数据库插入?
不仅没有必要,还与荒谬相接。
我可以在主进程的新线程中运行它们吗?
是