相关疑难解决方法(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万
查看次数

PostgreSQL的隐藏功能

我很惊讶这还没有发布.你在Postgres知道的任何有趣的技巧?晦涩的配置选项和缩放/执行技巧特别受欢迎.

我相信我们可以在相应的MySQL线程上击败9条评论:)

database postgresql rdbms postgresql-9.3

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

从C#DataTable批量插入的最佳方法

我有一个DataTable我想要推送到DB.我希望能够说出来

myDataTable.update();
Run Code Online (Sandbox Code Playgroud)

但在阅读MSDN 文档后,显然这确实是逐行插入的.

应该注意的是,这些陈述不是作为批处理执行的; 每行都单独更新.

我有什么选择?

编辑:我正在使用SQL Server 2005

c# .net-2.0

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

在Android中预先填充数据库的最快,最有效的方法

如果你想在Android中预先填充数据库(SQLite),这并不像人们想象的那么容易.

所以我发现这个教程也经常在Stack Overflow上引用.

但是我不喜欢这种预先填充数据库的方式,因为你从数据库处理程序中获取控件并自己创建文件.我宁愿不触摸文件系统,让数据库处理程序自己完成所有事情.

所以我认为可以做的就是像往常一样在数据库处理程序的onCreate()中创建数据库,然后从/ assets加载一个文件(.sql),其中包含要填充值的语句:

INSERT INTO testTable (name, pet) VALUES ('Mike', 'Tiger');
INSERT INTO testTable (name, pet) VALUES ('Tom', 'Cat');
...
Run Code Online (Sandbox Code Playgroud)

但是在处理程序的onCreate()中调用execSQL()并不能真正起作用.似乎/ assets文件的大小不得超过1MB,而execSQL()只执行第一个语句(Mike-Tiger).

你会做什么做预先填充数据库?

sql database sqlite android

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

如何将 CSV 文件批量插入 SQLite C#

我见过类似的问题 ( 1 , 2 ),但没有人讨论如何将 CSV 文件插入 SQLite。我唯一能想到的就是使用 aCSVDataAdapter并填充SQLiteDataSet,然后使用SQLiteDataSet更新数据库中的表:

我发现的唯一用于 CSV 文件的 DataAdapter 实际上不可用:

CSVDataAdapter CSVda = new CSVDataAdapter(@"c:\MyFile.csv");

CSVda.HasHeaderRow = true;

DataSet ds = new DataSet(); // <-- Use an SQLiteDataSet instead

CSVda.Fill(ds);
Run Code Online (Sandbox Code Playgroud)

要写入 CSV 文件:

CSVDataAdapter CSVda = new CSVDataAdapter(@"c:\MyFile.csv");

bool InclHeader = true;

CSVda.Update(MyDataSet,"MyTable",InclHeader);
Run Code Online (Sandbox Code Playgroud)

我发现上面的代码@ http://devintelligence.com/2005/02/dataadapter-for-csv-files/
CSVDataAdapter应该来与OpenNetCF自卫队,但它似乎没有可用了。

有人知道我在哪里可以得到CSVDataAdapter吗?也许有人知道更简单的事情:如何将 CSV 文件批量插入 SQLite ......您的帮助将不胜感激!

c# database csv sqlite bulkinsert

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

Java中的CPU利用率太低

嘿stackoverflow社区!

我遇到的问题是高度参与的算法程序正在使用TOO LITTLE cpu利用率:介于3%到4%之间.返回结果需要很长时间,而且我认为这还不够努力.

你们中的任何一个天才有任何想法为什么会发生这种情况 - 如果有什么我期望100%利用率.另外一个细节是该程序插入到sqlite3数据库中,因此,我相信通过sqlite3jdbc库有很多JNI调用.(请注意,我希望之前使用PreparedQuery批处理延迟这些插入,但这会导致严重的内存问题 - 这里有大量数据).

提前致谢

更新:已修复.是的,我只是一个doofus,但我没想到sqlite会启动一个新的事务并且做很多开销.

我现在使用PreparedStatement并在插入之前排队32768条目 - 对我来说似乎是一个足够好的数字.

java cpu utilization

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

SQLite导入选项卡文件:.import是每行执行一次插入还是使用事务对它们进行分组?

我从选项卡文件导入数百万行,而SQLite .import .mode选项卡非常慢.我有三个索引,所以可能是索引的缓慢.但首先我要检查.import是否将批次/所有这些行分组到一个提交中.我无法找到.import如何工作的文档.有人知道吗?如果索引是问题(我之前遇到过mysql问题)如何在.import结束时禁用它并重新索引?

[更新1]

关注@sixfeetsix评论.

我的架构是:

CREATE TABLE ensembl_vf_b36 (
        variation_name  varchar(20),
        chr     varchar(4),
        start   integer,
        end     integer,
        strand  varchar(5),
        allele_string    varchar(3),
        map_weight      varchar(2),
        flags           varchar(50),
        validation_status       varchar(100),
        consequence_type        varchar(50)
);
CREATE INDEX pos_vf_b36_idx on ensembl_vf_b36 (chr, start, end);
Run Code Online (Sandbox Code Playgroud)

数据:

rs35701516      NT_113875       352     352     1       G/A     2       NULL    NULL    INTERGENIC
rs12090193      NT_113875       566     566     1       G/A     2       NULL    NULL    INTERGENIC
rs35448845      NT_113875       758     758     1       A/C     2       NULL    NULL    INTERGENIC
rs17274850      NT_113875       1758    1758    1       G/A     2       genotyped       cluster,freq    INTERGENIC …
Run Code Online (Sandbox Code Playgroud)

sqlite

4
推荐指数
1
解决办法
4037
查看次数

Windows上速度最快的小型数据存储

我的应用程序跟踪大约1000个对象的状态.这些对象以无特定顺序从持久存储(序列化)读取和写入.

现在,应用程序使用注册表来存储每个对象的状态.这很好,因为:

  • 很简单

  • 它非常快

  • 可以读取/写入单个对象的状态,而无需读取更大的实体(例如从大型XML文件中提取片段)

  • 有一个像样的编辑器(RegEdit),可以轻松操作单个项目

话虽如此,我想知道是否有更好的方法.SQLite似乎是一种可能性,但是您没有使用注册表获得的同一级别的多读者/多作者,并且没有简单的方法来编辑现有条目.

有更好的建议吗?一堆平面文件?

c++ windows registry caching data-structures

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

批量插入SQLite.Net数据库

我需要在visual studio中对sqlite数据库执行批量访问.有人知道怎么做这个吗?

.net sqlite visual-studio

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

如何使用C API使用SQLite3 import命令?

我有以下代码:

int rc;
rc = sqlite3_exec(sqlite3_database, ".import mydata.csv mytable", callback, 0, &errMsg);
Run Code Online (Sandbox Code Playgroud)

运行此命令后,errMsg包含以下错误消息:

near ".": syntax error
Run Code Online (Sandbox Code Playgroud)

我假设它无法识别导入命令.但是,在命令行上从sqlite3程序运行它时,此命令有效.

我需要能够直接在我的程序中使用import命令.有没有办法可以做到这一点?我需要使用import命令的原因是因为为CSV文件的每一行执行插入需要超过5分钟,并且import命令需要一瞬间.

c sqlite iphone objective-c

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

在C#中向SQLite数据库添加大量数据

我目前正在尝试使用C#和System.Data.SQLite将大量数据添加到Windows 8 App中的SQLite数据库中.我在列表中有所有对象(MediaItem),并且我使用foreach-loop将每个对象添加到数据库中.不幸的是,这很慢,所以我想知道是否有办法加快速度.我可以举例说明将完整列表移交给数据库吗?到目前为止,这是我的代码:

List<MediaItem> items;

// adding lots of onbjects to the list...

using (var db = new SQLiteConnection(dbPath))
{
     foreach (var item in items)
     {
         db.Insert(item);
     }
 }
Run Code Online (Sandbox Code Playgroud)

c# database sqlite windows-store-apps

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