Android:几个SQLLite数据库,每个表一个,加速并发写入?

时间:2016-03-17 21:59:15

标签: java android multithreading sqlite

之前已经观察到,同时写入SQLLite数据库的速度是慢的"如果我们不使用交易(see this ...不确定这是如何适用于我们写入SD卡的Android)。据报道,没有多个线程写入同一个数据库。我记得读过,如果使用多个线程写入数据库,锁定速度会慢下来(如果再找到它,我会添加文章)。

现在,我有一个场景,我从十四个线程写到一个数据库。每次写入每秒大约在同一时间开始,由1到60个条目组成。 每个线程写入不同的表。这些表是完全独立的,即我永远不必进行连接或类似的事情。这使得mz场景与那些场景完全不同,例如What are the best practices for SQLite on Android?

我的问题是,虽然我已经通过缓存条目并使用事务将它们写入数据库进行了优化,但我仍然想知道是否可以通过为每个表创建单独的数据库来进一步加快速度 。也就是说,线程不应该以这种方式锁定。但我不确定这是否会产生预期效果,即完全摆脱锁定

你们有没有这方面的经验或者可以向我解释为什么或为什么我的方法不是一个好主意?提前谢谢。

1 个答案:

答案 0 :(得分:0)

好的,我在我的方案中做了一些实验结果并不是很清楚,但总的来说我会说,任何一种方法都应该没问题(使用一种方法或使用单独的数据库)我注意到,对于每个表最初速度较慢但随着时间的推移而加速的单独数据库存在轻微的趋势,而使用单个数据库在开始时似乎更快但随着时间的推移稍微减慢 。在这篇文章中,我将报告我的发现并接受它作为现在的答案。如果有人有更彻底的解释,可能有一些理论而不仅仅是经验证据,我会改变接受。

场景详细信息:我正在使用Microsoft Band 2 Android API,对于每个传感器,我使用HandlerThread定义一个侦听器并将其订阅到传感器管理器(始终使用最大频率)。每个侦听器都获得一个SQLiteOpenHelper,它用于获取可写数据库“getWriteableDatabase”。快速传感器在写入数据库之前缓存60个样本。 现在,我们可以为每个传感器定义不同的SQLiteOpenHelper,也可以使用相同的

由于我们同意使用转换使事情变得更快(我能够确认因子20的加速),我在以下实验中使用事务,即在我写入数据库之前缓存60个样本的传感器。

实验

在实验中,我计算每个传感器/螺纹的几个插入物的平均值。我报告用于平均的时间和样本数量。格式为

([average insert time in ms] / [number of runs] / [last insert time in ms]  ): [SENSOR]: [number of inserted values]

所有线程(一个数据库)的单个SQLiteOpenHelper

运行1

(93.18840579710145 / 69.0 / 76 ): ACCELEROMETER: 60
(99.52307692307693 / 65.0 / 66 ): GYROSCOPE: 60
(35.323076923076925 / 130.0 / 134 ): AMBIENT_LIGHT: 1
(41.0735294117647 / 68.0 / 148 ): HEART_RATE: 1
(37.257234726688104 / 311.0 / 114 ): GSR: 1
(43.79032258064516 / 62.0 / 57 ): CALORIES: 1
(41.62903225806452 / 62.0 / 41 ): DISTANCE: 1
(49.233333333333334 / 60.0 / 50 ): PEDOMETER: 1
(43.896907216494846 / 97.0 / 47 ): RR_INTERVAL: 1
(35.76923076923077 / 65.0 / 12 ): BAROMETER: 1
(44.223880597014926 / 67.0 / 22 ): ALTIMETER: 1
...
(105.2179675994109 / 679.0 / 62 ): ACCELEROMETER: 60
(106.58554572271386 / 678.0 / 68 ): GYROSCOPE: 60
(41.799546142208776 / 1322.0 / 33 ): AMBIENT_LIGHT: 1
(48.519578313253014 / 664.0 / 35 ): HEART_RATE: 1
(36.98158768487775 / 3313.0 / 67 ): GSR: 1
(46.8031007751938 / 645.0 / 18 ): CALORIES: 1
(46.826219512195124 / 656.0 / 14 ): DISTANCE: 1
(56.807633587786256 / 655.0 / 18 ): PEDOMETER: 1
(45.56761729530819 / 1087.0 / 18 ): RR_INTERVAL: 1
(49.16944024205749 / 661.0 / 31 ): BAROMETER: 1
(60.404833836858 / 662.0 / 40 ): ALTIMETER: 1

运行2

(88.95454545454545 / 66.0 / 128 ): ACCELEROMETER: 60
(75.109375 / 64.0 / 66 ): GYROSCOPE: 60
(31.906976744186046 / 129.0 / 16 ): AMBIENT_LIGHT: 1
(25.863636363636363 / 66.0 / 15 ): HEART_RATE: 1
(27.237942122186496 / 311.0 / 15 ): GSR: 1
(33.08064516129032 / 62.0 / 8 ): CALORIES: 1
(29.258064516129032 / 62.0 / 10 ): DISTANCE: 1
(39.0655737704918 / 61.0 / 15 ): PEDOMETER: 1
(32.406976744186046 / 86.0 / 11 ): RR_INTERVAL: 1
(32.640625 / 64.0 / 82 ): BAROMETER: 1
(41.292307692307695 / 65.0 / 89 ): ALTIMETER: 1
...
(94.10264385692068 / 643.0 / 61 ): ACCELEROMETER: 60
(77.9188767550702 / 641.0 / 77 ): GYROSCOPE: 60
(33.86671987230646 / 1253.0 / 19 ): AMBIENT_LIGHT: 1
(30.63809523809524 / 630.0 / 33 ): HEART_RATE: 1
(28.691152986266367 / 3131.0 / 12 ): GSR: 1
(32.55810147299509 / 611.0 / 22 ): CALORIES: 1
(31.56774193548387 / 620.0 / 41 ): DISTANCE: 1
(40.27786752827141 / 619.0 / 49 ): PEDOMETER: 1
(31.76108870967742 / 992.0 / 38 ): RR_INTERVAL: 1
(31.466453674121407 / 626.0 / 11 ): BAROMETER: 1
(40.610845295055825 / 627.0 / 19 ): ALTIMETER: 1

每个线程的不同SQLiteOpenHelper(每个传感器一个数据库)

运行1

(201.98076923076923 / 52.0 / 188 ): ACCELEROMETER: 60
(203.69230769230768 / 52.0 / 72 ): GYROSCOPE: 60
(100.16666666666667 / 102.0 / 37 ): AMBIENT_LIGHT: 1
(125.3    2692307692308 / 52.0 / 47 ): HEART_RATE: 1
(74.4563492063492 / 252.0 / 46 ): GSR: 1
(122.25490196078431 / 51.0 / 13 ): CALORIES: 1
(118.3921568627451 / 51.0 / 34 ): DISTANCE: 1
(127.82352941176471 / 51.0 / 29 ): PEDOMETER: 1
(112.72527472527473 / 91.0 / 34 ): RR_INTERVAL: 1
(106.27450980392157 / 51.0 / 18 ): BAROMETER: 1
(128.2941176470588 / 51.0 / 24 ): ALTIMETER: 1
...
(103.7621776504298 / 698.0 / 71 ): ACCELEROMETER: 60
(99.96418338108883 / 698.0 / 102 ): GYROSCOPE: 60
(27.61911764705882 / 1360.0 / 20 ): AMBIENT_LIGHT: 1
(31.57247437774524 / 683.0 / 37 ): HEART_RATE: 1
(24.713699031974187 / 3409.0 / 13 ): GSR: 1
(31.17921686746988 / 664.0 / 28 ): CALORIES: 1
(34.1037037037037 / 675.0 / 26 ): DISTANCE: 1
(36.275555555555556 / 675.0 / 31 ): PEDOMETER: 1
(30.485689505637467 / 1153.0 / 26 ): RR_INTERVAL: 1
(32.23494860499266 / 681.0 / 10 ): BAROMETER: 1
(36.75917767988253 / 681.0 / 16 ): ALTIMETER: 1

运行2

(126.11940298507463 / 67.0 / 77 ): ACCELEROMETER: 60
(128.82539682539684 / 63.0 / 44 ): GYROSCOPE: 60
(58.16153846153846 / 130.0 / 29 ): AMBIENT_LIGHT: 1
(62.53731343283582 / 67.0 / 28 ): HEART_RATE: 1
(50.798701298701296 / 308.0 / 9 ): GSR: 1
(81.62903225806451 / 62.0 / 33 ): CALORIES: 1
(57.45161290322581 / 62.0 / 19 ): DISTANCE: 1
(60.56666666666667 / 60.0 / 14 ): PEDOMETER: 1
(61.56603773584906 / 106.0 / 14 ): RR_INTERVAL: 1
(68.078125 / 64.0 / 23 ): BAROMETER: 1
(80.27272727272727 / 66.0 / 27 ): ALTIMETER: 1
...
(78.23076923076923 / 702.0 / 105 ): ACCELEROMETER: 60
(82.7560975609756 / 697.0 / 56 ): GYROSCOPE: 60
(27.407326007326006 / 1365.0 / 16 ): AMBIENT_LIGHT: 1
(25.03202328966521 / 687.0 / 17 ): HEART_RATE: 1
(22.503373423291286 / 3409.0 / 20 ): GSR: 1
(27.905263157894737 / 665.0 / 10 ): CALORIES: 1
(28.832592592592594 / 675.0 / 13 ): DISTANCE: 1
(30.034175334323923 / 673.0 / 17 ): PEDOMETER: 1
(25.60211267605634 / 1136.0 / 22 ): RR_INTERVAL: 1
(29.501466275659823 / 682.0 / 18 ): BAROMETER: 1
(33.88157894736842 / 684.0 / 23 ): ALTIMETER: 1