【问题标题】:SQLite .Net PerformanceSQLite .Net 性能
【发布时间】:2011-10-27 16:51:15
【问题描述】:

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

我以 10,000 条消息/秒的速度将项目输入缓存,总共 1.5 亿条消息。我的表很简单。它只有一个存储 id 的文本列。我使用字典在内存中完成这一切,但是,我正在处理数百万条消息,虽然这样很快,但一段时间后内存不足。

我研究了 sqlite 和性能,并且我知道配置是关键,但是,我仍然在插入方面获得可怕的性能(我还没有尝试过选择)。我什至无法跟上每秒 5000 次插入的速度。也许这是最好的。

我的连接字符串如下:

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

感谢您提供的任何帮助!

【问题讨论】:

    标签: c# .net sqlite caching


    【解决方案1】:

    由于您的要求非常具体,因此您最好使用更专用的东西,例如 memcached。这将提供一个非常高吞吐量的缓存实现,它比简单的哈希表更节省内存。

    Is there a port of memcache to .Net?

    【讨论】:

      【解决方案2】:

      如果您有许多线程写入同一个数据库,那么您将遇到每秒那么多事务的并发问题。 SQLite 总是锁定整个数据库的写入,因此一次只能处理一个写入事务。

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

      http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html

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

      【讨论】:

        【解决方案3】:

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

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

        你看过SQLite Optimization FAQ吗(有点旧)。

        SQLite performance tuning and optimization on embedded systems

        【讨论】:

        • 谢谢...是的,我正在使用一个事务,但我每次都在创建一个新事务。我也在使用参数化语句。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-12
        • 2016-10-08
        • 2013-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多