C# SQLite.Net性能

C# SQLite.Net性能,c#,.net,sqlite,caching,C#,.net,Sqlite,Caching,我试图在我的应用程序中使用sqlite作为一种缓存。我这么说是因为我的缓存中的项目永远不会过期,我也不会存储任何东西。我只需要使用缓存来存储我以前处理过的所有ID。我不想处理任何事情两次 我正在以每秒10000条消息的速度将项目输入缓存,总共有1.5亿条消息。我的桌子很简单。它只有一个存储id的文本列。我使用字典在内存中完成这些工作,然而,我正在处理数百万条消息,尽管这样做速度很快,但一段时间后我的内存就用完了 我已经研究过sqlite和性能,我知道配置是关键,但是,我仍然在insert上获得糟

我试图在我的应用程序中使用sqlite作为一种缓存。我这么说是因为我的缓存中的项目永远不会过期,我也不会存储任何东西。我只需要使用缓存来存储我以前处理过的所有ID。我不想处理任何事情两次

我正在以每秒10000条消息的速度将项目输入缓存,总共有1.5亿条消息。我的桌子很简单。它只有一个存储id的文本列。我使用字典在内存中完成这些工作,然而,我正在处理数百万条消息,尽管这样做速度很快,但一段时间后我的内存就用完了

我已经研究过sqlite和性能,我知道配置是关键,但是,我仍然在insert上获得糟糕的性能(我还没有尝试过选择)。我甚至无法跟上每秒5000次的插入。也许这是最好的了

我的连接字符串如下所示:

Data Source=filename;Version=3;Count Changes=off;Journal Mode=off;
     Pooling=true;Cache Size=10000;Page Size=4096;Synchronous=off

谢谢你能提供的任何帮助

如果您同时执行大量插入或更新,请将它们放入事务中

此外,如果每次执行的SQL基本相同,请使用参数化语句

你看过(有点旧的)吗


如果有多个线程写入同一个数据库,那么每秒有那么多事务会导致并发问题。SQLite始终锁定整个数据库的写入,因此一次只能处理一个写入事务

另一种选择是使用SQLite的Oracle Berkley DB。Berkley DB的最新版本包括一个SQLite前端,该前端具有页面级锁定机制,而不是数据库级锁定机制。当存在高并发性要求时,这将提供更高的每秒事务数


它包括同一个SQLite.NET提供程序,应该是一个替代品。

因为您的需求非常具体,所以最好使用更专用的东西,比如memcached。这将提供一个非常高吞吐量的缓存实现,它比简单的哈希表具有更高的内存效率


谢谢……是的,我正在使用一个事务,但每次都会创建一个新事务。我还使用参数化语句。