SQL Server Compact по сравнению со структурами данных C # - PullRequest
3 голосов
/ 18 июля 2011

В настоящее время мы используем List<T> для хранения событий из проекта симуляции, который мы выполняем.Нам необходимо оптимизировать использование памяти и время, необходимое для обработки событий, чтобы получить определенные ключевые метрики.

Мы думали переместить журнал событий в таблицу базы данных SQL Server Compact, а затем, возможно, использовать Linq для вычисления метрик.По вашему опыту, вы думаете, что будет быстрее использовать SQL Server Compact, чем встроенные структуры данных C #, или у нас будут проблемы?

Ответы [ 5 ]

3 голосов
/ 18 июля 2011

Некоторые идеи.

MSMQ ( Microsoft Message Queue )

Вы можете удалить поток из MSMQ и обновить метрики влетать.Если вам нужно сохранить эти события для последующей обработки, вы можете поместить их в базу данных по мере их удаления из очереди.MSMQ демонстрирует гораздо лучшую масштабируемость в этих сценариях - особенно когда издатель и подписчик имеют асимметричные скорости обработки;и используются двоичные данные (так как SQL может затормозиться с выделением пространства для VARBINARY или выделением / разделением страниц для индексов).

Два других сценария SQL дополняют этот - вы все еще можетеиспользовать снятие очереди для вставки в SQL;чтобы избежать каких-либо сбоев в моделировании, пока SQL выделяет пространство.

Вы можете в некоторой степени обойти то, что сказал @Aliostad, используя этот.

OLAP ( Аналитическая обработка в режиме онлайн )

Похоже, вы могли бы извлечь выгоду из OLAP (кубы и т. Д.).Это увеличит общее время выполнения вашей симуляции, но улучшит ценность данных.К сожалению, это означает, что нужно потратить деньги на одну из самых больших редакций SQL.

Хранимые процедуры

Хотя Linq-to-SQL отлично подходит для «среднего разработчика», пожалуйста, продолжайтеот этого в научных проектах.Существует множество замечательных приемов, которые вы можете использовать в сыром TSQL, в дополнение к возможности проверки плана запросов.Если вы хотите максимально возможной производительности, тщательно спланируйте свою БД и создайте хранимые процедуры / UDF для агрегирования ваших данных.

Если вы можете рассчитать только некоторые показатели в C #, сделайте столько же работы в SQL заранее -и затем не стесняйтесь использовать Linq-to-SQL для захвата данных.

Также помните, что если вы вставляете в конец MSMQ, вы можете агрессивно индексировать, что ускорит ваши вычисления метрик, не влияя на вашу симуляцию.

Я бы включил SQL только в том случае, если существует реальная потребность в более эффективном использовании памяти (т. Е. У вас фактически не хватает).

Файлы с отображением в памяти

Это позволяет компенсировать давление памяти на диск;с потерей производительности, если его нужно «выгружать» обратно.

В целом

Я мог бы избежать Linq для определения основных метрик - сделать это в SQL.MSMQ, без сомнения, огромный победитель в этом деле.Не переусердствуйте с проблемой памяти и держите ее в .Net, если у вас не хватает памяти.

1 голос
/ 18 июля 2011

Если вам нужно обработать все события, C # List<> будет работать быстрее, чем Sql Server. Array<> будет иметь лучшую производительность, особенно если элементы являются структурами, а не классами, поскольку структуры помещаются в массивы, где экземпляры классов ссылаются только на массив. Наличие структур в массиве уменьшает сборку мусора и увеличивает локальность кэша.

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

  1. C # структуры данных, созданные специально для ваших нужд.
  2. Sql Server
  3. Наивные структуры данных C #, перебирая список в поисках нужных элементов.
0 голосов
/ 18 июля 2011

Нам нужно оптимизировать использование памяти

Использовать Sql-Server-CE

время, необходимое для обработки событий

Используйте Linq-To-Objects.


Эти две цели противоречивы , и вам нужно выбрать ту, которая важнее для вас.

0 голосов
/ 18 июля 2011

Зависит от того, что вы подразумеваете под «более быстрым использованием». Если речь идет о производительности доступа к данным, то это всего лишь , сколько данных у вас есть, для больших данных решение БД, только для статистических целей, безусловно, хороший выбор.

Как и БД, для такого рода целей я бы предложил SQLite : поскольку это один файл (не требуется таких сервисов, как SQL Server compact ), полностью поддерживаемый ACID БД. Но опять же, это зависит от размера ваших данных, так как SQLite имеет предел данных ниже по сравнению с SQLServer .

Привет.

0 голосов
/ 18 июля 2011

Похоже, вы думаете, что вам нужно иметь их в базе данных, чтобы использовать Linq.Это не тот случай.Вы можете использовать Linq со встроенными структурами csharp.

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