Любой хороший метод для работы с большим количеством данных? - PullRequest
0 голосов
/ 05 июля 2010

У меня есть почти 100 000 записей в базе данных, и мне нужно сравнить их друг с другом с помощью алгоритма Longest Common Subsequence, и мне нужно делать это с 1000 новых записей каждый день.Мое приложение написано на c # .Net, и проблема в том, что это сравнение работает медленно на уровне приложения, для сравнения 1000 записей требуется более 10 часов.Так кто-нибудь знает, насколько быстрее это пойдет, если я напишу этот алгоритм в хранимой процедуре на SQL, или есть другой способ?

Ответы [ 5 ]

4 голосов
/ 05 июля 2010

Возможно, вы захотите попытаться написать сохраненный процесс на C #, если вы используете SQL Server 2005 или 2008. Это может масштабироваться лучше в долгосрочной перспективе, так как вы получаете все больше и больше записей и не можете хранить их все в памяти.

Ознакомьтесь с MSDN Введение в SQL Server Интеграция CLR .

Это будет использовать больше ЦП на вашем сервере БД, но вам не нужно передавать данные обратно ип.

3 голосов
/ 05 июля 2010

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

Это будет намного быстрее

1 голос
/ 05 июля 2010

Я не уверен, что TSQL даст вам такую ​​же гибкость, как C #, особенно когда вы имеете дело со сложными алгоритмами, такими как LCS.Сохраняйте все необходимые записи в памяти и обрабатывайте их оттуда.

Теперь самое важное, что вы можете на минуту задуматься и перейти к другому подходу, пытаясь вставить какие-либо флаги (ранжирование)как только новый элемент вставлен.Никто не может посоветовать вам здесь, так как вы не предоставили немного информации о том, что вы делаете и с чем сравниваете.Вероятно, вы можете облегчить процесс с некоторым рейтингом, сделанным во время вставки нового элемента.Я не имею в виду полное сравнение после добавления нового элемента, но для запуска события, как каждый час или около того, вы обновляете таблицу без ввода данных пользователем.

0 голосов
/ 05 июля 2010

Как вы определяете, что две ваши записи следуют друг от друга (то есть, что они являются частью подпоследовательности)? Может быть, вам не нужно сравнивать все 1 МБ каждой записи, и вы могли бы ускорить процесс, только проанализировав некоторую часть этого?

Мне кажется, что ваш алгоритм ошибочен или что БД может быть не лучшим способом хранения ваших данных, если для сравнения каждой записи требуется 2 секунды?

0 голосов
/ 05 июля 2010

Это правда, что хранимая процедура работает быстрее, чем LinQ или View.Это способ быстрого сбора ваших данных.

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