gpt4 book ai didi

c++ - SQLite C++ API 事务处理缓慢

转载 作者:行者123 更新时间:2023-11-27 23:51:06 25 4
gpt4 key购买 nike

我对 SQLite 有疑问。似乎每个调用都需要大约 300 毫秒才能执行。经过一些测试后,我注意到延迟是由事务引起的。 8 个带有隐式事务的普通插入大约需要 2 秒,但是,如果我在插入之前启动一个事务并在之后提交它,我可以同时执行近一百万次插入。受影响的调用包括 DROP TABLE、CREATE TABLE、INSERT,我假设还有其他调用(可能所有这些都隐含地开始一个事务)。

更多信息:

  • 从SQLite网站(3200100)下载源码合并
  • 使用 Visual Studio 将它编译成一个静态库(不使用任何编译器标志,尽管我一直在玩弄它们但运气不好)
  • 我正在使用 sqlite3_open16,然后是 sqlite3_prepare16_v3,然后是 sqlite3_step 开始执行和/或接收第一个结果
  • 无多线程,无多进程访问,数据库文件由本程序独占打开
  • 如果我在我的 SSD (960 EVO) 上创建文件,“交易延迟”会从 300 毫秒减少到 10 毫秒。虽然仍然是一个荒谬的高值(value),但我觉得我的磁盘速度不应该影响任何减慢交易速度的因素?
  • 阻塞的函数是 sqlite3_step(例如,我必须调用具有该名称的函数来执行 DROP TABLE,但这并不重要,这也让我很烦)
  • 编辑:在交易期间,CPU 使用率为 100%。

附带说明一下,如果您知道表的每一行都恰好是 64 字节,是否可以“帮助”SQLite 组织数据?

我希望你能帮我解决这个问题,或者推荐一个替代方案(关系型、c++ api、基于文件、高性能)非常感谢!

最佳答案

SQLite 做了很多努力来确保它不会遭受数据损坏,因此对于隐式事务,您会受到硬盘速度的限制。

通过事务,将数据写入其他位置,只提交一次磁盘,速度更快

来自 sqlite speed

With synchronization turned on, SQLite executes an fsync() system call (or the equivalent) at key points to make certain that critical data has actually been written to the disk drive surface.

创建事务时,数据会被写入其他文件,只有当所有数据都提交后,才会支付fsync成本,并且全部一起。这是该部分配置的价格。一个积极的方面是,我从未因损坏而丢失 sqlite 数据。

I feel like the speed of my disk shouldn't influence whatever is slowing the transactions down?

这是一个重要的权衡。如果您想要提高数据完整性,那么磁盘的速度就很重要。

How long does committing a transaction take?

来自 sqlite faq :19 why are transactions slow

SQLite will easily do 50,000 or more INSERT statements per second on an average desktop computer. But it will only do a few dozen transactions per second.

你可以:-

  1. 使用交易绑定(bind)更多工作。费用按每笔交易计算,因此可以增加。
  2. 使用临时表。临时表不会影响性能,并且会全速运行。
  3. 不推荐。使用 PRAGMA synchronous=OFF 禁用同步写入。

关于c++ - SQLite C++ API 事务处理缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46383416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com