我有一个移动应用程序.我的客户端有大量数据集~100,000条记录.它经常更新.我们同步时需要从一个数据库复制到另一个数据库.
我已将第二个数据库附加到main,并运行一个insert into table select * from sync.table.
这非常慢,我认为大约需要10分钟.我注意到日志文件逐步增加.
我怎样才能加快速度呢?
编辑1
我有索引,我有日记.运用
insert into table select * from sync.table
Run Code Online (Sandbox Code Playgroud)
它还需要10分钟.
编辑2
如果我运行像这样的查询
select id,invitem,invid,cost from inventory where itemtype = 1
order by invitem limit 50
Run Code Online (Sandbox Code Playgroud)
需要15-20秒.
表模式是:
CREATE TABLE inventory
('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
'serverid' INTEGER NOT NULL DEFAULT 0,
'itemtype' INTEGER NOT NULL DEFAULT 0,
'invitem' VARCHAR,
'instock' FLOAT NOT NULL DEFAULT 0,
'cost' FLOAT NOT NULL DEFAULT 0,
'invid' VARCHAR,
'categoryid' INTEGER DEFAULT …Run Code Online (Sandbox Code Playgroud) 我正在寻找在我的应用程序中减少SQLite3的内存消耗的方法.
在每次执行时,它都会创建具有以下模式的表:
(main TEXT NOT NULL PRIMARY KEY UNIQUE,count INTEGER DEFAULT 0)
Run Code Online (Sandbox Code Playgroud)
之后,数据库每秒充满50k操作.只写.
当一个项目已经存在时,它会使用更新查询更新"count"(我认为这称为UPSERT).这些是我的疑问:
INSERT OR IGNORE INTO table (main) VALUES (@SEQ);
UPDATE tables SET count=count+1 WHERE main = @SEQ;
Run Code Online (Sandbox Code Playgroud)
这样,每个事务有500万次操作,我可以非常快速地写入数据库.
我真的不关心这个问题的磁盘空间,但我有一个非常约束的RAM空间.因此,我不能浪费太多记忆.
使用sqlite3_user_memory()通知其执行期间内存消耗增长到近3GB.如果我通过sqlite3_soft_heap_limit64()将其限制为2GB,则当达到2GB时,数据库操作性能几乎降至零.
我不得不将缓存大小提高到1M(默认页面大小)以达到理想的性能.
我该怎么做才能减少内存消耗?
我有一个for循环,它使用我编写的sqlite管理器类对数据库进行了许多更改,但我不确定我多久需要提交...
for i in list:
c.execute('UPDATE table x=y WHERE foo=bar')
conn.commit()
c.execute('UPDATE table x=z+y WHERE foo=bar')
conn.commit()
Run Code Online (Sandbox Code Playgroud)
基本上我的问题是我是否必须在那里调用两次提交,或者我是否可以在完成两次更改后调用它一次?
该.sqliterc为sqlite3的文件主要是为建议.这和.那风格的点命令,比如广受欢迎的MySQL的输出仿真:
.header on
.timer on
.mode column
Run Code Online (Sandbox Code Playgroud)
但是,您可以将所需的任何SQL放入.sqliterc.一旦你意识到sqlite3有多慢,默认情况下,在处理大型数据集时,你会学到一些PRAGMA命令,这些命令可以让生活更美好,比如PRAGMA synchronous = OFF;.
这些命令也可以放在.sqliterc中,如果您了解这些命令会影响您使用命令行"sqlite3"工具执行的所有操作,无论哪个数据库!在我的情况下,这很好.对于我使用,在特定机器上Linux的帐户,我想其中的一些PRAGMA设置,所有的时间.
然而,一些PRAGMA设置产生验证输出,如yes或off或exclusive或memory.当你做这样的事情时,这就成了一个问题,那些额外的小输出词会被默默地包括在内:
echo "select * from blah;" | sqlite3 foo.db > output.txt
echo "select * from blah;" | sqlite3 foo.db | wc -l
Run Code Online (Sandbox Code Playgroud)
如果你碰巧在.sqliterc中有5个PRAGMA语句,并且其中2个产生输出,那么第二个例子(wc -l)中的行数将会减少两个,而你的数据output.txt并不完全符合你的预期.那些额外的2行stdout不是stderr顺便说一句.
详细说明,使用包含以下内容的.sqliterc文件:
PRAGMA synchronous = OFF;
PRAGMA foreign_keys = ON;
PRAGMA journal_mode = …Run Code Online (Sandbox Code Playgroud) 我正在开发一个桌面应用程序,它使用SQLite将数万行批量插入SQLite数据库.我想帮助优化批量插入性能.目前,将60兆位的数据插入数据库需要50秒.
我可以用什么连接字符串参数来提高性能?我应该更改缓冲区大小吗?这可以通过连接字符串参数吗?是否有其他连接字符串参数可以提高性能?我当前的连接字符串是:
Data Source = Batch.db; Version = 3; Pooling = True; Max Pool Size = 10; Synchronous = off; FailIfMissing = True; Journal Mode = Off;
我正在使用Dapper ORM.(由StackOverflow的人建造)有没有更快的方法在.net中批量插入Sqlite?
System.Data.Sqlite用于插入SQLite.如何获得一个特殊的sqlite编译版本来提高性能呢?SQLite的一个版本比另一个版本好吗?目前正在使用http://sqlite.phxsoftware.com上的 System.Data.SQLite
目前,我在事务中包装插入以使它们更快(这是一个很好的改进).
我一次插入一张表到17张表.我可以在不同的线程上并行化这个并使其更快吗?
目前的表现. 这是典型的吗?我可以做得更好吗?
我喜欢SQLite,但我希望能让它快一点.目前使用XML序列化将我的对象保存到XML文件比保存到SQLite数据库要快,所以我的老板问:为什么要切换到SQLite?或者我应该使用MongoDB还是其他一些对象数据库?
我对SQLite查询有几个问题.实际上我开始认为SQLite不是为超过10行的表设计的,实际上,SQLite是一场噩梦.
以下查询
SELECT * FROM [Table] WHERE [Name] LIKE 'Text%'
Run Code Online (Sandbox Code Playgroud)
它工作正常.EXPLAIN显示使用索引并在about之后返回结果70ms.
现在我需要从.NET SQLite驱动程序运行此查询,所以我正在更改查询
SELECT * FROM [Table] WHERE [Name] LIKE @Pattern || '%'
Run Code Online (Sandbox Code Playgroud)
索引未使用.当我在任何SQLite工具中运行以下查询时,也不使用索引
SELECT * FROM [Table] WHERE [Name] LIKE 'Text' || '%'
Run Code Online (Sandbox Code Playgroud)
所以我猜SQLite没有实现任何类型的预处理逻辑.
好.让我们尝试解决它,我仍然绑定变量并执行以下操作
SELECT * FROM [Table] WHERE [Name] LIKE @Pattern
Run Code Online (Sandbox Code Playgroud)
但现在我将%通配符添加到我的模式字符串的末尾,就像这样
command.Parameters.Add(new SQLiteParameter("@Pattern", pattern + '%'));
Run Code Online (Sandbox Code Playgroud)
它工作得很慢.我不能说为什么,因为当我从SQLite工具运行此查询时它工作正常,但是当我从.NET代码绑定此变量时,它工作缓慢.
好.我还在努力解决这个问题.我正在摆脱模式参数绑定并动态构建此条件.
pattern = pattern.Replace("'", "''");
pattern = pattern.Replace("%", "\\%");
where = string.Format("LIKE '{0}%' ESCAPE '\\'", pattern);
Run Code Online (Sandbox Code Playgroud)
索引不再使用.它没有被使用,因为ESCAPE.当我跑步时,我看到了
EXPLAIN QUERY PLAN SELECT …Run Code Online (Sandbox Code Playgroud) 我正在编写一个执行一些身份验证操作的函数.我有一个文件,所有的user_id:password:flag夫妻结构如下:
Users.txt
user_123:a1b2:0 user_124:a2b1:1 user_125:a2b2:2
这是代码:
int main(){
/*...*/
/*user_id, password retrieving*/
USRPSW* p = malloc(sizeof(USRPSW));
if(p == NULL){
fprintf(stderr, "Dynamic alloc error\n");
exit(EXIT_FAILURE);
}
memset((void*)p, 0, sizeof(USRPSW));
if(usr_psw_read(acc_sock_ds, p->user_id, USR_SIZE) <= 0){
printf("Failed read: connection with %s aborted.\n",
inet_ntoa(client_addr.sin_addr));
close(acc_sock_ds);
continue;
}
if(usr_psw_read(acc_sock_ds, p->password, PSW_SIZE) <= 0){
printf("Failed read: connection with %s aborted.\n",
inet_ntoa(client_addr.sin_addr));
close(acc_sock_ds);
continue;
}
/*Authentication through user_id, password*/
FILE *fd;
fd = fopen(USERSFILE, "r");
if(fd == NULL){
fprintf(stderr, "Users file opening error\n");
exit(EXIT_FAILURE);
} …Run Code Online (Sandbox Code Playgroud) 我正在使用下面的代码批量插入30000行(一次1000行).它仍然没有那么快.在这个例子中提高SQLite的INSERT每秒性能?我可以看到他们只创建了SqliteCommand一次,然后重新循环它重置它并清除绑定.但是,我无法在iOS/Monotouch上找到合适的方法.没有Reset()或ClearBindings()任何其他类似的东西.
using ( var oConn = new SqliteConnection ( "Data Source=" + DB_NAME ) )
{
oConn.Open ( );
// Wrap the whole bulk insertion into one block to make it faster, otherwise one transaction per INSERT would be created.
// Note that this is differen from "BEGIN TRANSACTION" which would increase memory usage a lot!
SqliteCommand oCmd = new SqliteCommand ( "BEGIN", oConn );
oCmd.ExecuteNonQuery ( );
oCmd.Dispose ( );
foreach …Run Code Online (Sandbox Code Playgroud) 我正在编写一个应用程序,它必须经常记录信息,比如说,一秒钟两次.我希望将信息保存到sqlite数据库,但我不介意每十分钟提交一次磁盘更改.
使用文件数据库时执行查询需要很长时间,并使计算机滞后.
一个可选的解决方案是使用内存数据库(它适合,不用担心),并不时将其同步到磁盘,
可能吗?有没有更好的方法来实现它(你能告诉sqlite只在X查询后提交到磁盘吗?).
我可以解决这个用Qt的SQL包装器?
我必须在SQLite数据库中添加大量数据,并且需要一些建议如何在iOS中执行该功能.我必须将大约1 GB的数据从服务器同步到iPhone SQLite数据库.
我需要其他方法在iOS端的数据库中存储快速数据.我试图逐个存储数据,但同步和存储数据需要花费太多时间.
sqlite ×9
c# ×3
.net ×2
c ×2
performance ×2
bulkinsert ×1
dapper ×1
database ×1
eof ×1
fgets ×1
indexing ×1
ios ×1
objective-c ×1
python ×1
qt ×1
sql ×1
unix ×1
xamarin.ios ×1