【问题标题】:Android: Will several SQLLite databases, one for each table, speed up concurrent writes?Android:多个 SQLite 数据库,每个表一个,会加速并发写入吗?
【发布时间】:2016-07-04 12:05:03
【问题描述】:

之前已经观察到,如果我们不使用事务,并发写入 SQLLite 数据库是“慢”的(see this ...不确定这如何适用于我们写入 SD 卡的 Android) .这是在没有多个线程写入同一数据库的情况下报告的。我记得读过,如果使用多个线程写入数据库,锁定会更慢(如果我再次找到它,我会添加这篇文章)。

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

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

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

【问题讨论】:

  • 请考虑您的数据库在使用闪存的手机上。使用不同的文件意味着重写该闪存的完全不同的块,这意味着性能实际上可能会因使用多个文件而受到更多影响,而不是单个文件,其中对每个表的写入可以组合成单个闪存块的写入。
  • 感谢您的意见!我的想法是一样的,但是 SQLLite 的锁定机制会阻止来自不同线程的写入被组合,我认为,因为对于每次写入,它都会锁定,直到文件系统确认更新。至少我从上面链接的 SQLLite FAQ 中是这样理解的。你怎么看?
  • @MarcB 闪存已经进行了磨损均衡,因此所有新数据都将在同一个块中结束。

标签: java android multithreading sqlite


【解决方案1】:

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

详细场景:我正在使用 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

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

运行 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2015-10-26
    • 2012-07-04
    相关资源
    最近更新 更多