在Android SQLite数据库中存储值的最快方法?
我需要将来自10个传感器的同时读数以大约100Hz存储到SQLite数据库中。这意味着我需要在数据库中每秒存储大约1000个读数。在Android SQLite数据库中存储值的最快方法?
我试过把数据库插入方法放在一个服务在其自己的进程中运行,但我只能收集大约3.5秒的数据。我认为该服务正在被杀死。
我没有使用数据库事务来插入数据。只需单独调用INSERT INTO ...使用交易至关重要?
是否需要在单独的进程中运行数据库插入?我可以在主流程的新线程中运行它们吗?
如果需要,我可以提供代码。
您需要使用事务处理,并通过在同一事务中执行多个插入操作来“分块”处理您的请求。你必须使用插入的数量,但我会从每个事务处理1000个插入开始,并从那里调整它。
如果您想要一次插入一条记录,事务会非常缓慢。原因是SQLite在完成事务之前等待将数据写入磁盘,因此必须等待磁盘盘片完全旋转,在此期间磁盘基本不活动。
在7200 RPM硬盘驱动器上,这基本上限制了每秒60个事务。
我需要从10个传感器同步读数存储到SQLite数据库在100Hz左右
如果你指的是Android的传感器,我是你真正能拿到的数据传递不确定性给你很快。
我试过把数据库插入方法在服务以其自身的进程
运行时,不要使用一个单独的进程。你正在增加开销,没有任何好处。
从您的传感器注册的任何组件中执行您的数据库I/O。如果这是一项服务,没问题。
我只能收集大约3.5秒的数据。我认为该服务正在被杀死。
然后你有更大的问题。包含运行服务的进程在启动后3.5秒内不会被终止。不知怎的,你的服务实现是搞砸了。
我没有使用数据库事务插入数据
哈维先生所指出的,交易是对性能至关重要。
使用交易至关重要吗?
是的。
是否需要在单独的进程中运行数据库插入?
不仅没有必要,它接近荒谬。
我可以在主流程的新线程中运行吗?
是的。
我从通过蓝牙发送信号的Arduino微处理器读取数据。我使用BroadcastReceiver的onReceive()方法捕获读数并将其发送到数据库。 – wasatch14 2012-04-02 23:41:30
@ wasatch14:“我正在使用BroadcastReceiver的onReceive()方法来捕获读数并将它们发送到数据库” - 我能看到这个工作的唯一方法就是如果你有''BroadcastReceiver'注册了'Service'通过'registerReceiver()'。该服务将分派一个监听LinkedBlockingQueue的线程来聚合数据并使用事务将其清空到数据库。 – CommonsWare 2012-04-02 23:47:48
请注意,Android设备没有7200rpm的硬盘驱动器。 Flash速度很慢,特别是在Android 2.2上,我们被YAFFS2文件系统控制。这就是说,交易仍然是至关重要的,考虑到存储的速度,交易更是如此。 – CommonsWare 2012-04-02 23:25:14
我不知道你可以把这么多的插入到一个单一的交易。我会给那一枪。感谢您的快速回复! – wasatch14 2012-04-02 23:42:29