Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / высокопроизводительная CLR-сборка с кодом на C++ для SQL Server / 25 сообщений из 93, страница 1 из 4
27.07.2013, 15:25
    #38346339
andreybs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
Есть потребность в реализации высокопроизводительного алгоритма для математических вычислений на основе данных MSSQL. Результаты вычислений так же сохраняются в MSSQL.

Первая версия алгоритма реализована на T-SQL. Оптимизация программы показала невозможность избавиться от операций записи в журнале транзакций даже при отказе от использования физических таблиц в процессе расчета. Вывод - вынести расчет за пределы SQL Server.

Вторая версия алгоритма реализована на C# в виде CLR-сборки (Safe/DLL) под .Net 3.5. Производительность повысилась на несколько порядков. Однако ряд ограничений C# не позволяет добиться максимума производительности.
1. Сборщик мусора не позволяет самостоятельно удалять объекты, а их в процессе вычислений создается целая куча -> перерасход памяти.
2. Тип структур является типом данных и не может быть использован для построения индексных массивов (с элементами типа ссылки на структуру), что приводит к использованию классов вместо структур, а значит перерасходу памяти и возможному снижению производительности.
3. Требуется кодогенерация (переопределение математических функций) при создании экземпляра объекта. В C# - это делегаты, анонимные и лямбда-методы. В С++ это просто ссылка на функцию. Существует большое отличие с точки зрения производительности при использовании этих подходов.
4. Судя по тестам в Интернете C# существенно уступает С++ в производительности математических программ.
Вывод - сделать CLR-сборку на C++.

Проблема в том, что в VS2012 ultimate я не нашел типа проекта SQL CLR для VC++. Есть только шаблон SQL Server для C# и VB.NET. Когда я пытался собирать DLL на базе шаблона C++ CLR, то какие бы я ни ставил настройки компилятора, MSSQL2008 всегда отказывался импортировать сборку по самым разным причинам.

Вопросы:
1. Что думаете по поводу описанных выше недостатков C#. Я не писал на нем ранее, поэтому могу многого не знать и делать неверные выводы.
2. Был ли опыт создания CLR-сборок для MSSQL на C++? На MSDN есть примеры кода для VS2008, которые не работают в VS2012. Неужели нужно даунгрейдить VS???
3. Стоит ли использовать связку MSSQL->CLR на C#->DLL на C++? Здесь C# будет использоваться только для обращения к БД и передаче данных в DLL на C++ для вычислений.

Буду признателен, если укажете ссылки на тематические статьи в Интернете или примеры кода/настроек компилятора VC++.
Спасибо!
...
Рейтинг: 0 / 0
27.07.2013, 16:00
    #38346346
xstored
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
andreybs,

Я бы не заморачивался с CLR а создал бы обычную extended stored procedure на C
...
Рейтинг: 0 / 0
27.07.2013, 16:23
    #38346357
andreybs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
xstoredandreybs,

Я бы не заморачивался с CLR а создал бы обычную extended stored procedure на C

Я тоже сначала думал проапгрейдить SQL до 2012 и использовать его возможности инлайн-процедур. Но одной процедурой не обойтись. И сохранять промежуточные результаты нужно в независимой области памяти для быстрого повторного обращения к ним. Все таки это должна быть внешняя библиотека.
...
Рейтинг: 0 / 0
27.07.2013, 16:31
    #38346363
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
andreybsИ сохранять промежуточные результаты нужно в независимой области памяти для быстрого повторного обращения к ним.
ещё один источник геморроя с CLR
...
Рейтинг: 0 / 0
27.07.2013, 16:41
    #38346370
andreybs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
ИзопропилandreybsИ сохранять промежуточные результаты нужно в независимой области памяти для быстрого повторного обращения к ним.
ещё один источник геморроя с CLR

Проблема только в неуправляемости процессом освобождения памяти. Там есть свои "лазейки", но в С++ это делается просто и наглядно. Поэтому и хочется найти возможность собрать CLR-сборку на С++.
...
Рейтинг: 0 / 0
27.07.2013, 16:46
    #38346372
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
andreybs,

соберите её без всяких визардов, как unsafe регистрируйте на сервере
...
Рейтинг: 0 / 0
27.07.2013, 17:12
    #38346388
andreybs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
Изопропилandreybs,

соберите её без всяких визардов, как unsafe регистрируйте на сервере

Пробовал, не получилось. SQL Server в этом случае ругается, что сборка не является нативной .NET (хотя я использовал библиотеки .Net 2.0.0.0).
...
Рейтинг: 0 / 0
28.07.2013, 00:58
    #38346518
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
andreybsSQL Server в этом случае ругается, что сборка не является нативной .NET
регистрируемая сборка должна компилироваться с /clr:pure, а дальше эта сборка может уже обращаться к нормальному коду через P/Invoke
...
Рейтинг: 0 / 0
28.07.2013, 11:29
    #38346552
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
andreybsxstoredandreybs,

Я бы не заморачивался с CLR а создал бы обычную extended stored procedure на C

Я тоже сначала думал проапгрейдить SQL до 2012 и использовать его возможности инлайн-процедур. Но одной процедурой не обойтись. И сохранять промежуточные результаты нужно в независимой области памяти для быстрого повторного обращения к ним. Все таки это должна быть внешняя библиотека.


extended stored procedure (XP) и есть внешняя библиотека. Или внутренняя. Что ты вообще понимаешь под "внешностью" или "внутренностью"? XP -- это .dll, других библиотек особенно и не бывает.
...
Рейтинг: 0 / 0
28.07.2013, 11:31
    #38346553
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
andreybsИзопропилпропущено...

ещё один источник геморроя с CLR

Проблема только в неуправляемости процессом освобождения памяти. Там есть свои "лазейки", но в С++ это делается просто и наглядно. Поэтому и хочется найти возможность собрать CLR-сборку на С++.

А тебе зачем собственно CLR ?
...
Рейтинг: 0 / 0
28.07.2013, 11:43
    #38346559
andreybs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
ИзопропилandreybsSQL Server в этом случае ругается, что сборка не является нативной .NET
регистрируемая сборка должна компилироваться с /clr:pure, а дальше эта сборка может уже обращаться к нормальному коду через P/Invoke

Начиная с MSSQL2005 это не поддерживается для VC++, если верить MSDNу
...
Рейтинг: 0 / 0
28.07.2013, 11:57
    #38346561
andreybs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
MasterZivandreybsпропущено...


Проблема только в неуправляемости процессом освобождения памяти. Там есть свои "лазейки", но в С++ это делается просто и наглядно. Поэтому и хочется найти возможность собрать CLR-сборку на С++.

А тебе зачем собственно CLR ?

Потому что вызов пересчета должен происходить изнутри SQL Server, а он использует либо CLR, либо unsafe сборки. Последнее заколебешься дебагить в случае ошибки. Хотя и это ограничение можно обойти, собрав простое консольное приложение на С++ (в перспективе виндовс-сервис), которое лезет в сиквел и делает тоже самое, что и CLR на C#. Но тут сложность - как управлять этим консольным приложением. В конечном счете основную часть кода можно будет вынести в DLL и дебагить ее с помощью вызова из консольного приложения, а в рабочем режиме эта DLL будет цепляться к SQL как unsafe сборка с external или unrestricted access. Как то так, но до этого еще не скоро. Сначала отлажу алгоритм на C# и посмотрю на результаты. Может овчинка выделки не стоит...
...
Рейтинг: 0 / 0
28.07.2013, 12:03
    #38346564
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
andreybsНачиная с MSSQL2005 это не поддерживается для VC++, если верить MSDNу
Поддерживается (сборки /clr:pure)

UNSAFE enables assemblies unrestricted access to resources, both within and outside an instance of SQL Server. Code running from within an UNSAFE assembly can call unmanaged code.
http://msdn.microsoft.com/en-us/library/ms189524.aspx

P.S. крики о deprecated extended stored procedure слышны уже много лет
...
Рейтинг: 0 / 0
28.07.2013, 12:09
    #38346566
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
andreybsНо тут сложность - как управлять этим консольным приложением.
andreybsМожет овчинка выделки не стоит...
в вашем случае - похоже не стоит.
...
Рейтинг: 0 / 0
28.07.2013, 13:31
    #38346586
andreybs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
ИзопропилandreybsНачиная с MSSQL2005 это не поддерживается для VC++, если верить MSDNу
Поддерживается (сборки /clr:pure)


Технически да, поддерживаются, но с целым рядом ограничений , которые в моем случае не позволят обеспечить прямое взаимодействие SQL<->DLL, только через интерфейсную прослойку SQL<->DLL/CLR<->DLL/Unmanaged. Это возможно, но очень геморно с точки зрения дебагинга, о чем я писал выше. Если проигнорировать ограничения, то при импорте такой DLL/CLR MSSQL выдаст ошибку - "unsupported clr code", а если /pure заменить на /safe, то даже не используя элементы unmanaged code все равно при импорте вылетает ошибка " assembly not supported " вне зависимости от того, на базе какой версии .Net это все собрано.


ИзопропилUNSAFE enables assemblies unrestricted access to resources, both within and outside an instance of SQL Server. Code running from within an UNSAFE assembly can call unmanaged code.
http://msdn.microsoft.com/en-us/library/ms189524.aspx

P.S. крики о deprecated extended stored procedure слышны уже много лет

Да понятно, но лично я не встречал юзабельных возможностей по поддержке deprecated SP в mssql. Говорят, в 2012 они тали лучше. Не знаю, посмотрим. Но судя по документации, в которой нет примеров на c++, только c# и asp.net, Майкрософт развивает свою технологию clr в связке с .Net и им нафиг сдалось поддерживать c++ с его unmanaged кодом. Так что писать библиотеки для mssql на c++ становится все сложнее и сложнее.
...
Рейтинг: 0 / 0
28.07.2013, 14:28
    #38346613
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
andreybsХотя и это ограничение можно обойти, собрав простое консольное приложение на С++ (в перспективе виндовс-сервис),
соберите клиентское приложение, не насилуйте сервер.

andreybsНо тут сложность - как управлять этим консольным приложением
это существенно проще, чем заставить сервер выполнять не свойственную ему работу

Вопрос замены сервера на PostgeSQL не рассматривался?
...
Рейтинг: 0 / 0
28.07.2013, 16:37
    #38346649
andreybs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
ИзопропилВопрос замены сервера на PostgeSQL не рассматривался?

Не рассматривался. В MSSQL реализованы алгоритмы обработки данных, на базе которых далее производятся вычисления. Объемы данных довольно большие. Тут нужна мощная СУБД.
...
Рейтинг: 0 / 0
28.07.2013, 20:26
    #38346758
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
andreybs,

Про С++ тут нет ничего. Перенесу тему в C#, если нет возражений.
...
Рейтинг: 0 / 0
28.07.2013, 23:25
    #38346881
andreybs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
MasterZivandreybs,

Про С++ тут нет ничего. Перенесу тему в C#, если нет возражений.

Не возражаю.

Модератор: Тема перенесена из форума "C++".
...
Рейтинг: 0 / 0
29.07.2013, 11:10
    #38347102
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
andreybs, что приводит к использованию классов вместо структур, а значит перерасходу памяти и возможному снижению производительности.
сколько байтов считали?

Добавляет ли readonly property к размеру класса?
...
Рейтинг: 0 / 0
29.07.2013, 11:22
    #38347114
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
ИзопропилandreybsНачиная с MSSQL2005 это не поддерживается для VC++, если верить MSDNу
Поддерживается (сборки /clr:pure)

UNSAFE enables assemblies unrestricted access to resources, both within and outside an instance of SQL Server. Code running from within an UNSAFE assembly can call unmanaged code.
http://msdn.microsoft.com/en-us/library/ms189524.aspx

P.S. крики о deprecated extended stored procedure слышны уже много лет

крики то слышны, но как обычно будет версия, в которой это уже не поддерживается.
Я бы не делал ESP.

SQLCLR есть и надо пользоваться.
...
Рейтинг: 0 / 0
29.07.2013, 11:36
    #38347132
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
WinnipuhSQLCLR есть и надо пользоваться.
так топикстартеру не нравится.
...
Рейтинг: 0 / 0
30.07.2013, 00:18
    #38348014
andreybs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
Изопропилandreybs, что приводит к использованию классов вместо структур, а значит перерасходу памяти и возможному снижению производительности.
сколько байтов считали?

Добавляет ли readonly property к размеру класса?

Точно не считал, но оптимизировал как мог, чтобы сохранить читабельность кода при минимуме размеров. В итоге получилась примерно такая модель:

struct D
{
... 5-7 переменных типа Int32 и Double
}

Class C
{
T Parent; // ссылка на родительский объект
List<T> Links; // 10-20 связей на каждый объект
D Data; // структура с данными
C(...) { конструктор }
}

Выделил 4 типа данных T, для каждого из которых применил подобную модель. Всего одновременно живет до 1000 объектов (пока, в перспективе до 10000). За счет перекрестных ссылок все данные представлены одновременно в иерархическом/сетевом (для вычислений) и плоском представлении (для импорта/экспорта). Все управление классами делается на базе внешнего статического класса (экономим на таблице методов в каждом классе). Использовать структуры не получится, т.к. для создания перекрестных ссылок нужно ссылаться на объект из нескольких индексных массивов одновременно.

В этом все деле меня больше всего интересует освобождение памяти после отчуждения объектов (на примере класса выше):
1. Нужно ли ставить Parent=null, чтобы разорвать сильные связи объектов и облегчить работу сборщика мусора.
2. Нужно ли ставить Links.Capacity=0 после очистки массива, чтобы высвободить память для повторного использования новым объектом.
...
Рейтинг: 0 / 0
30.07.2013, 00:22
    #38348017
andreybs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
ИзопропилWinnipuhSQLCLR есть и надо пользоваться.
так топикстартеру не нравится.

Я не против. Но хотел бы сделать это на С++. Но собрать сборку, которую схавает SQL пока не получилось.
...
Рейтинг: 0 / 0
30.07.2013, 07:49
    #38348088
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
andreybsоптимизировал как мог, чтобы сохранить читабельность кода при минимуме размеров
не торопитесь с оптимизацией кода - оптимизируйте сначала алгоритм

andreybsВыделил 4 типа данных T, для каждого из которых применил подобную модель
особого смысла в выделении типа D - не вижу. Каковы отношения между четырьмя типами T и C?

andreybsВсего одновременно живет до 1000 объектов (пока, в перспективе до 10000).
10000 - это очень мало.

andreybsВсе управление классами делается на базе внешнего статического класса (экономим на таблице методов в каждом классе).
ничего не экономим - все экземпляры класса используют одну общую таблицу методов

andreybs1. Нужно ли ставить Parent=null, чтобы разорвать сильные связи объектов и облегчить работу сборщика мусора.
облегчить таким способом нельзя. Если на экземпляр класса в программе нет никаких ссылок - мусоросборщика не волнует, на кого ссылается этот экземпляр. Рихтера почитайте.

andreybs2. Нужно ли ставить Links.Capacity=0 после очистки массива, чтобы высвободить память для повторного использования новым объектом.
нет, не нужно. Capacity влияет только на начальное выделение памяти для списка
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / высокопроизводительная CLR-сборка с кодом на C++ для SQL Server / 25 сообщений из 93, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]