gpt4 book ai didi

database - SQLite 与序列化到磁盘

转载 作者:IT王子 更新时间:2023-10-29 06:25:42 25 4
gpt4 key购买 nike

我正在做一些性能比较,是序列化数据还是将它们存储在数据库中。应用程序收到大量数据 (x GB),需要以 18mb/s 的最低速度(目前)进行持久化

在以后搜索和访问数据、数据快照、数据迁移等方面,存储在数据库中提供了更简单的功能,但到目前为止,我的测试显示性能时间存在巨大差异。

该测试保存了 1000 个对象(每个对象大约 700kb)。通过将它们另存为通用列表,将它们保存到表中各自的列或磁盘。 (SQLite 以更多数据结束)

  1. 保存到 SQLite v3,总大小 745mb:30.7 秒(~速度:24.3 mb/s)
  2. 序列化到磁盘,总大小 741mb:0.33 秒(~速度:2245 mb/s)

我没有对 SQLite 进行任何性能调整,只是将它与 Fluent nHibernate 和 SQLite.Data 适配器(无事务)一起使用,但起初认为这是一个巨大的差异。

显然,我知道通过 ORM 映射器和 DB 写入磁盘与序列化相比会产生开销,但这很多。

还需要考虑的是在我收到数据时立即保存数据。如果出现电源故障,我需要收到最后的数据。

有什么想法吗?

----- 更新(随着我继续研究解决方案)-----

  • 将 1000 次插入包装在一个事务中,现在的时间是 ~14s = 53mb/s,但是如果我在中途抛出异常,我将丢失所有数据。
  • 使用 IStatelessSession 似乎可以将时间缩短 0.5-1 秒
  • 通过将 ID 分配给实体而不是在表中自动分配 ID 并因此摆脱每个插入 sql 的 (select row_generatedid()),没有看到任何性能提升。 -> Id(x => x.Id).GeneratedBy.Assigned();
  • SQLite 中的 nosync() 替代方案不是替代方案,因为在发生电源故障时数据库可能会损坏。

最佳答案

我有一次 similar problem,我建议你走 SQLite 路线。

至于您的性能问题,我敢肯定如果您执行以下操作,您将获得非常显着的提升:

  1. 在单个事务中执行所有 INSERT - 写入查询必须获取(并释放)对 SQLite 文件的锁定,这在磁盘 I/O 方面非常昂贵,您应该注意到 huge boost ***
  2. 考虑使用 multi-INSERT(这可能对你不起作用,因为你依赖 ORM)
  3. 正如@user896756 提到的,您还应该准备您的声明

测试 1:1000 次插入

CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100));
INSERT INTO t1 VALUES(1,13153,'thirteen thousand one hundred fifty three');
INSERT INTO t1 VALUES(2,75560,'seventy five thousand five hundred sixty');
... 995 lines omitted
INSERT INTO t1 VALUES(998,66289,'sixty six thousand two hundred eighty nine');
INSERT INTO t1 VALUES(999,24322,'twenty four thousand three hundred twenty two');
INSERT INTO t1 VALUES(1000,94142,'ninety four thousand one hundred forty two');
  • PostgreSQL:4.373
  • MySQL:0.114
  • SQLite 2.7.6:13.061
  • SQLite 2.7.6(非同步):0.223

测试 2:事务中 25000 个 INSERT

BEGIN;
CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100));
INSERT INTO t2 VALUES(1,59672,'fifty nine thousand six hundred seventy two');
... 24997 lines omitted
INSERT INTO t2 VALUES(24999,89569,'eighty nine thousand five hundred sixty nine');
INSERT INTO t2 VALUES(25000,94666,'ninety four thousand six hundred sixty six');
COMMIT;
  • PostgreSQL:4.900
  • MySQL:2.184
  • SQLite 2.7.6:0.914
  • SQLite 2.7.6(非同步):0.757

*** 这些基准测试适用于 SQLite 2,SQLite 3 should be even faster

关于database - SQLite 与序列化到磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7900368/

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