Производительность SQLite .Net - PullRequest
4 голосов
/ 16 августа 2011

Я пытаюсь использовать sqlite в своем приложении в качестве своего рода кеша. Я говорю вроде как, потому что элементы никогда не истекают из моего кэша, и я ничего не храню. Мне просто нужно использовать кеш для хранения всех идентификаторов, которые я обработал раньше. Я не хочу ничего обрабатывать дважды.

Я ввожу элементы в кеш со скоростью 10000 сообщений в секунду, что в общей сложности составляет 150 миллионов сообщений. Мой стол довольно прост. В нем только один текстовый столбец, в котором хранятся идентификаторы. Я делал все это в памяти, используя словарь, однако я обрабатываю миллионы сообщений и, хотя это происходит быстро, через некоторое время мне не хватило памяти.

Я исследовал sqlite и производительность, и я понимаю, что конфигурация является ключевой, однако я все еще получаю ужасную производительность на вставках (я еще не пробовал выбирать). Я не могу идти в ногу даже с 5000 вставок / сек. Может быть, это так хорошо, как это получается.

Моя строка подключения выглядит следующим образом:

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

Спасибо за любую помощь, вы можете предоставить!

Ответы [ 3 ]

5 голосов
/ 16 августа 2011

Если вы выполняете много операций вставки или обновления одновременно, поместите их в транзакцию.

Кроме того, если вы выполняете по существу один и тот же SQL каждый раз, используйте параметризованный оператор.

Вы смотрели FAQ по оптимизации SQLite (немного устаревший).

Настройка и оптимизация производительности SQLite во встроенных системах

1 голос
/ 16 августа 2011

Если у вас много потоков, пишущих в одну и ту же базу данных, вы столкнетесь с проблемами параллелизма с таким количеством транзакций в секунду.SQLite всегда блокирует всю базу данных для записи, поэтому одновременно может обрабатываться только одна транзакция записи.

Альтернативой является Oracle Berkley DB с SQLite.Эта последняя версия Berkley DB включает в себя интерфейс SQLite, который имеет механизм блокировки на уровне страницы вместо уровня базы данных.Это обеспечивает гораздо большее количество транзакций в секунду при высоком требовании к параллелизму.

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

Он включает в себя того же поставщика SQLite.NET и должен быть заменой в виде замены..

0 голосов
/ 16 августа 2011

Поскольку ваши требования настолько специфичны, вам может быть лучше чем-то более посвященным, например memcached. Это обеспечит реализацию кэширования с очень высокой пропускной способностью, которая будет намного более эффективно использовать память, чем простая хеш-таблица.

Есть ли порт memcache для .Net?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...