相关疑难解决方法(0)

提高SQLite的每秒INSERT性能?

优化SQLite很棘手.C应用程序的批量插入性能可以从每秒85次插入到每秒超过96,000次插入!

背景:我们使用SQLite作为桌面应用程序的一部分.我们有大量的配置数据存储在XML文件中,这些数据被解析并加载到SQLite数据库中,以便在初始化应用程序时进行进一步处理.SQLite非常适合这种情况,因为它速度快,不需要专门配置,数据库作为单个文件存储在磁盘上.

理由: 最初我对我所看到的表现感到失望.事实证明,SQLite的性能可能会有很大差异(对于批量插入和选择),具体取决于数据库的配置方式以及如何使用API​​.弄清楚所有选项和技术是什么并不是一件小事,所以我认为创建这个社区wiki条目以与Stack Overflow读者分享结果是谨慎的,以便为其他人节省相同调查的麻烦.

实验:我不是简单地谈论一般意义上的性能提示(即"使用事务!"),而是认为最好编写一些C代码并实际测量各种选项的影响.我们将从一些简单的数据开始:

  • 多伦多市完整交通时间表的28 MB TAB分隔文本文件(约865,000条记录)
  • 我的测试机器是运行Windows XP的3.60 GHz P4.
  • 该代码使用Visual C++ 2005 编译为"Release",带有"Full Optimization"(/ Ox)和Favor Fast Code(/ Ot).
  • 我正在使用SQLite"Amalgamation",直接编译到我的测试应用程序中.我碰巧遇到的SQLite版本有点旧(3.6.7),但我怀疑这些结果与最新版本相当(如果你不这么想请发表评论).

我们来写一些代码吧!

代码:一个简单的C程序,它逐行读取文本文件,将字符串拆分为值,然后将数据插入SQLite数据库.在代码的这个"基线"版本中,创建了数据库,但我们实际上不会插入数据:

/*************************************************************
    Baseline code to experiment with SQLite performance.

    Input data is a 28 MB TAB-delimited text file of the
    complete Toronto Transit System schedule/route info
    from http://www.toronto.ca/open/datasets/ttc-routes/

**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "sqlite3.h"

#define INPUTDATA "C:\\TTC_schedule_scheduleitem_10-27-2009.txt"
#define DATABASE "c:\\TTC_schedule_scheduleitem_10-27-2009.sqlite"
#define …
Run Code Online (Sandbox Code Playgroud)

c sqlite optimization performance

2880
推荐指数
9
解决办法
38万
查看次数

由于索引,SQLite插入速度会随着记录数量的增加而减慢

原始问题

背景

众所周知,SQLite 需要经过精细调整,以实现大约50k插入/秒的插入速度.这里有很多关于缓慢插入速度和大量建议和基准的问题.

还有声称SQLite可以处理大量数据,50 GB以上的报告不会导致正确设置出现任何问题.

我已经按照这里和其他地方的建议来实现这些速度,我很高兴35k-45k插入/秒.我遇到的问题是所有的基准测试只能显示<1m记录的快速插入速度.我所看到的是插入速度似乎与表格大小成反比.

问题

我的用例要求[x_id, y_id, z_id]在链接表中存储500米到1b元组()几年(1米行/天).值均为介于1和2,000,000之间的整数ID.有一个索引z_id.

前10米行的性能非常好,约35k插入/秒,但是当表有~20m行时,性能开始下降.我现在看到大约100个插入/秒.

桌子的大小不是特别大.对于20米行,磁盘上的大小约为500MB.

该项目是用Perl编写的.

这是SQLite中大型表的现实,还是有任何保密措施来维护 > 10m行的表的高插入率?

已知的解决方法,如果可能,我想避免

  • 删除索引,添加记录和重新索引:这可以作为一种解决方法,但在更新期间仍需要使用数据库时不起作用.在x分钟/天内完全无法访问数据库是行不通的
  • 将表分成较小的子表/文件:这将在短期内起作用,我已经尝试过它.问题是我需要能够在查询时从整个历史记录中检索数据,这意味着最终我将达到62表附件限制.附加,收集临时表中的结果,并且每个请求分离数百次似乎是很多工作和开销,但如果没有其他选择,我会尝试它.
  • 设置 SQLITE_FCNTL_CHUNK_SIZE:我不知道C(?!),所以我不想仅仅为了完成这项工作而学习它.我看不到使用Perl设置此参数的任何方法.

UPDATE

蒂姆的建议,一个指数,尽管SQLite的的说法,它能够处理大型数据集导致越来越缓慢插入时间,我进行以下设置的基准进行比较:

  • 插行:1400万
  • 提交批量大小:50,000条记录
  • cache_sizepragma:10,000
  • page_size实用语:4,096
  • temp_storepragma:记忆
  • journal_modepragma:删除
  • synchronouspragma:关闭

在我的项目中,与下面的基准测试结果一样,创建了基于文件的临时表,并使用了SQLite对导入CSV数据的内置支持.然后将临时表附加到接收数据库,并使用insert-select语句插入50,000行的集合 .因此,插入时间不会将文件反映到数据库插入时间,而是反映 表到表的插入速度.考虑CSV导入时间会使速度降低25-50%(非常粗略估计,导入CSV数据不需要很长时间).

显然有一个索引会导致插入速度随着表格大小的增加而减慢.

SQLite插图速度和表大小的图

从上面的数据可以清楚地看出,正确的答案可以分配给Tim的答案,而不是SQLite无法处理它的断言.显然,如果索引该数据集不是您的用例的一部分,它可以处理大型数据集.我一直在使用SQLite作为日志记录系统的后端,暂时 …

database sqlite optimization insert

60
推荐指数
2
解决办法
2万
查看次数

使用具有低基数的索引是否有意义?

我主要是一个Actionscript开发人员,绝不是SQL专家,但我不得不开发简单的服务器端.所以,我想我会在标题中向更有经验的人询问这个问题.

我的理解是,通过在一个包含很少不同值的列中设置索引,您不会获得太多收益.我有一个包含布尔值的列(实际上它是一个小的int,但我将它用作标志),并且此列用于我所拥有的大多数查询的WHERE子句中.在理论上的"平均"情况下,一半的记录值将为1而另一半为0.因此,在这种情况下,数据库引擎可以避免全表扫描,但无论如何都必须读取大量行(总行/ 2).

那么,我应该将此列作为索引吗?

为了记录,我正在使用Mysql 5,但是我更感兴趣的是一般的理由,为什么它有/无意义索引一个我知道将具有低基数的列.

提前致谢.

mysql sql indexing cardinality

38
推荐指数
3
解决办法
1万
查看次数

SQLite数据库的大小是否有限制?

我已经阅读了他们的限制FAQ,除了整个数据库的限制之外,他们谈论了许多限制.

sqlite

30
推荐指数
4
解决办法
4万
查看次数

sqlite表中的最大行数

给一个简单的sqlite3 table(create table data (key PRIMARY KEY,value)),密钥大小为256字节,值大小为4096字节,这个sqlite3表中最大行数的限制(忽略磁盘空间限制)是多少?他们的限制是否与操作系统相关(win32,linux或Mac)

database sqlite sizing

24
推荐指数
4
解决办法
6万
查看次数

*具有持久性存储的大型*python字典,可快速查找

我有4亿行独特的键值信息,我希望能够在脚本中快速查找.我想知道这样做的方式是什么.我确实考虑了以下但不确定是否有一种磁盘映射字典的方法,并且除了在字典创建期间没有使用大量内存.

  1. 腌制字典对象:不确定这是否是我的问题的最佳解决方案
  2. NoSQL类型dbases:理想情况下需要对第三方内容具有最小依赖性的东西加上键值只是数字.如果你觉得这仍然是最好的选择,我也想听听.可能它会说服我.

如果有任何不清楚的地方,请告诉我.

谢谢!-Abhi

python persistence object-persistence

22
推荐指数
4
解决办法
8757
查看次数

是否有"嵌入式DBMS"来支持同一个db文件上的多个编写器应用程序(进程)?

我需要知道是否有任何嵌入式DBMS(最好是Java,不一定是关系型),它支持同一组db文件上的多个编写器应用程序(进程).BerkeleyDB支持多个读者,但只支持一个编写器.我需要多个作家和多个读者.

更新:

它不是多重连接问题.我的意思是我不需要多个连接到正在运行的DBMS应用程序(进程)来写入数据.我需要多个DBMS应用程序(进程)来提交相同的存储文件.

HSQLDB,H2,JavaDB(Derby)和MongoDB不支持此功能.

我认为可能存在一些禁止这种情况的文件系统限制.如果是这样,是否有一个文件系统允许单个文件上有多个编写器?

使用案例:用例是一个高吞吐量的集群系统,旨在将其大量业务日志条目存储到SAN存储中.将业务日志存储在每个服务器的单独文件中是不合适的,因为整个业务日志需要查询和索引功能.

因为"SAN通常是自己的常规设备通常无法通过常规网络访问的存储设备网络",所以我希望使用SAN网络带宽进行日志记录,同时将群集LAN带宽用于其他服务器到服务器和客户端服务器通信.

java database file

15
推荐指数
2
解决办法
2811
查看次数

SQLite:实际限制是什么?

在您将此问题标记为重复之前,请听我说!
我已经阅读过这里提出的关于如何提高性能的问题,例如,提一下提高SQLite的每秒INSERT性能?什么是源码的非常大的数据库文件的性能特点?

我正在努力使sqlite工作的数据库文件大小为5千兆字节.相反,那里有人,即使数据库大小高达160 GB,他们声称sqlite对他们来说"很棒".我自己没有尝试过,但是从提出的问题来看,我想所有的基准测试都可能只用数据库中的表来完成.

我使用的数据库
- 20页左右的表
-表中有一半以上的15列
-每个15或那么列的表都有6/7的外键列-其中的几个表已经长大在一个月内拥有2700万条记录

我使用的开发机器是3 GHz四核机器,有4 GB RAM,但只需要3分钟就可以查询这些大表中的row_count.

我找不到任何方法来水平划分数据.我拥有的最佳镜头是将数据分成多个数据库文件,每个表一个.但在这种情况下,据我所知,外键列约束不能使用,所以我将不得不创建一个自足表(没有任何外键).

所以我的问题是
a)我是否使用错误的数据库进行工作?
b)你觉得我哪里出错了?
c)我还没有在外键上添加索引,但如果只是行计数查询需要四分钟,外键索引如何帮助我?

编辑提供更多信息,即使没有人要求它:)我使用SQLite版本3.7.9与system.data.sqlite.dll版本1.0.77.0

EDIT2:我认为我与160位演员的不同之处在于他们可以选择单独的唱片或小范围的唱片.但是我必须在表中加载所有2700万行,将它们与另一个表连接起来,按照用户的要求对记录进行分组并返回结果.有什么输入是为这些结果优化数据库的最佳方法.

我不能缓存先前查询的结果,因为它在我的情况下没有意义.点击缓存的可能性相当低.

sqlite select database-performance

7
推荐指数
1
解决办法
8775
查看次数

我的JavaSE应用程序的集成数据库

我不知道是否提出这个问题的正确位置,但我在这里问.

我到现在为止做了什么:

JavaSE(Swings,JavaFX)等所有项目中,我使用MySQL,Oracle,MS SQL Server作为后端.

但对于其中任何一个,我需要安装像MySQL服务器个人软件.

我想知道是否有可能获得这个东西的替代品,这样我就不需要为数据库安装任何额外的个人软件.

数据库应该集成在我的JavaSE应用程序中,就像我们在普通软件中看到的那样.我们只是为它安装软件而不是单独的DBMS.

这样的数据库允许我进行备份.

有什么建议吗?

java database

6
推荐指数
1
解决办法
2847
查看次数

sqlite中的大型数据库 - 文件大小考虑?

我正在使用一个非常方便的sqlite数据库,这似乎满足了我的所有需求.

目前我的数据库大小<50MB,但我现在需要添加一个新表来存储大文本blob,这将导致db在明年内达到5GB.

sqlite能够处理5GB的db大小吗?与mysql相比,有什么警告吗?

database sqlite

5
推荐指数
1
解决办法
3695
查看次数

我可以在SQLite Android中的表中插入多少行?

我有一个50万行的CSV文件.我要将所有CSV文件行插入到在SQLite Android中创建的表中.我想知道我可以在SQLite的任何表中插入多少行?

csv sqlite android rows import-from-csv

3
推荐指数
1
解决办法
1869
查看次数

处理文件太大而无法存储在内存中?

我有一个20 GB的文件,如下所示:

Read name, Start position, Direction, Sequence
Run Code Online (Sandbox Code Playgroud)

请注意,读取名称不一定是唯一的.

例如,我的文件片段看起来像

Read1, 40009348, +, AGTTTTCGTA
Read2, 40009349, -, AGCCCTTCGG
Read1, 50994530, -, AGTTTTCGTA
Run Code Online (Sandbox Code Playgroud)

我希望能够以允许我的方式存储这些行

  1. 保持文件根据第二个值排序
  2. 迭代已排序的文件

似乎可以使用数据库.

文档似乎暗示dbm不能用于对文件进行排序并对其进行迭代.

因此,我想知道SQLite3是否能够做1)和2).我知道我将能够使用SQL查询对文件进行排序,并使用sqlite3迭代结果集.但是,如果没有4GB的RAM计算机内存不足,我能够这样做吗?

python sqlite dbm large-files

3
推荐指数
1
解决办法
1576
查看次数