2011-09-28 98 views
4

我正在开发一个嵌入式系统,它需要非常频繁地存储和检索数据。我预计每秒可能有100个写入和10个读取。数据将以连发形式出现,而不是连续出现。高性能SQLite选项

我想使用SQLite来存储所有这些数据,但由于它是一个闪存文件系统,写入(INSERTS & UPDATES)太慢了。我尝试设置synchronous = off,这确实可以提高性能,但是我对于破坏数据库感到紧张。

在我的应用程序中,电源故障将是一种罕见但实际的可能性。我可以忍受失去一些最近的数据,但绝对不能冒损失数据库损坏导致的所有数据的风险。

我也想过用一个内存中的SQLite数据库作为主数据库,并定期同步到文件系统中Synchronizing sqlite database from memory to file

讨论是否有我应该考虑其他的选择吗?

+0

>>'我绝对不会冒险因为数据库损坏而丢失所有数据......我可以忍受丢失一些最近的数据......“<<这将建议一个解决方案,您定期与外部数据库或导出,这取决于您禁用SQLite中的哪些安全功能以获得更高的插入速度,从而增加数据丢失而无需恢复的风险。 – Tim

回答

5

当一连串的数据到达时,一定要在单个事务中执行一系列的插入和更新操作。

sqlite3_exec(handle, "BEGIN TRANSACTION", NULL, NULL, NULL); 

for (...) { 
    // Do your inserts/updates 
} 

sqlite3_exec(handle, "END TRANSACTION", NULL, NULL, NULL); 

默认情况下,SQLite会将每个插入/更新放入其自己的事务中。如果底层文件系统很慢,这会使SQLite非常慢。通过声明自己的事务,可以显着减少对文件系统执行的实际写入量,从而大大提高SQLite的性能。

+0

我意识到单个命令在事务之外的性能损失,并且我在测试中使用了这个。然而,在应用程序中,由于数据将作为流接收,因此不清楚事务边界应该发生在哪里。可能最终由蒸汽插入和/或超时的数量划定界限。 – mccleanp

1

我不知道你的数据集有多大,但是如果它们不太大,那么WAL模式可能会有所帮助。您可以使用"PRAGMA synchronous=1"进行试验:此设置在每次交易后都不会同步,但偶尔会发生。 (默认值:写入2 MB新数据时)SQLite文档说,您可能会丢失一些最近的事务,但数据库不会损坏。