|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
Есть потребность в реализации высокопроизводительного алгоритма для математических вычислений на основе данных 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++. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2013, 15:25 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2013, 16:00 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
xstoredandreybs, Я бы не заморачивался с CLR а создал бы обычную extended stored procedure на C Я тоже сначала думал проапгрейдить SQL до 2012 и использовать его возможности инлайн-процедур. Но одной процедурой не обойтись. И сохранять промежуточные результаты нужно в независимой области памяти для быстрого повторного обращения к ним. Все таки это должна быть внешняя библиотека. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2013, 16:23 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
andreybsИ сохранять промежуточные результаты нужно в независимой области памяти для быстрого повторного обращения к ним. ещё один источник геморроя с CLR ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2013, 16:31 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
ИзопропилandreybsИ сохранять промежуточные результаты нужно в независимой области памяти для быстрого повторного обращения к ним. ещё один источник геморроя с CLR Проблема только в неуправляемости процессом освобождения памяти. Там есть свои "лазейки", но в С++ это делается просто и наглядно. Поэтому и хочется найти возможность собрать CLR-сборку на С++. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2013, 16:41 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
andreybs, соберите её без всяких визардов, как unsafe регистрируйте на сервере ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2013, 16:46 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
Изопропилandreybs, соберите её без всяких визардов, как unsafe регистрируйте на сервере Пробовал, не получилось. SQL Server в этом случае ругается, что сборка не является нативной .NET (хотя я использовал библиотеки .Net 2.0.0.0). ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2013, 17:12 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
andreybsSQL Server в этом случае ругается, что сборка не является нативной .NET регистрируемая сборка должна компилироваться с /clr:pure, а дальше эта сборка может уже обращаться к нормальному коду через P/Invoke ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2013, 00:58 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
andreybsxstoredandreybs, Я бы не заморачивался с CLR а создал бы обычную extended stored procedure на C Я тоже сначала думал проапгрейдить SQL до 2012 и использовать его возможности инлайн-процедур. Но одной процедурой не обойтись. И сохранять промежуточные результаты нужно в независимой области памяти для быстрого повторного обращения к ним. Все таки это должна быть внешняя библиотека. extended stored procedure (XP) и есть внешняя библиотека. Или внутренняя. Что ты вообще понимаешь под "внешностью" или "внутренностью"? XP -- это .dll, других библиотек особенно и не бывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2013, 11:29 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
andreybsИзопропилпропущено... ещё один источник геморроя с CLR Проблема только в неуправляемости процессом освобождения памяти. Там есть свои "лазейки", но в С++ это делается просто и наглядно. Поэтому и хочется найти возможность собрать CLR-сборку на С++. А тебе зачем собственно CLR ? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2013, 11:31 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
ИзопропилandreybsSQL Server в этом случае ругается, что сборка не является нативной .NET регистрируемая сборка должна компилироваться с /clr:pure, а дальше эта сборка может уже обращаться к нормальному коду через P/Invoke Начиная с MSSQL2005 это не поддерживается для VC++, если верить MSDNу ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2013, 11:43 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
MasterZivandreybsпропущено... Проблема только в неуправляемости процессом освобождения памяти. Там есть свои "лазейки", но в С++ это делается просто и наглядно. Поэтому и хочется найти возможность собрать CLR-сборку на С++. А тебе зачем собственно CLR ? Потому что вызов пересчета должен происходить изнутри SQL Server, а он использует либо CLR, либо unsafe сборки. Последнее заколебешься дебагить в случае ошибки. Хотя и это ограничение можно обойти, собрав простое консольное приложение на С++ (в перспективе виндовс-сервис), которое лезет в сиквел и делает тоже самое, что и CLR на C#. Но тут сложность - как управлять этим консольным приложением. В конечном счете основную часть кода можно будет вынести в DLL и дебагить ее с помощью вызова из консольного приложения, а в рабочем режиме эта DLL будет цепляться к SQL как unsafe сборка с external или unrestricted access. Как то так, но до этого еще не скоро. Сначала отлажу алгоритм на C# и посмотрю на результаты. Может овчинка выделки не стоит... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2013, 11:57 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
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 слышны уже много лет ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2013, 12:03 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
andreybsНо тут сложность - как управлять этим консольным приложением. andreybsМожет овчинка выделки не стоит... в вашем случае - похоже не стоит. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2013, 12:09 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
Изопропил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++ становится все сложнее и сложнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2013, 13:31 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
andreybsХотя и это ограничение можно обойти, собрав простое консольное приложение на С++ (в перспективе виндовс-сервис), соберите клиентское приложение, не насилуйте сервер. andreybsНо тут сложность - как управлять этим консольным приложением это существенно проще, чем заставить сервер выполнять не свойственную ему работу Вопрос замены сервера на PostgeSQL не рассматривался? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2013, 14:28 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
ИзопропилВопрос замены сервера на PostgeSQL не рассматривался? Не рассматривался. В MSSQL реализованы алгоритмы обработки данных, на базе которых далее производятся вычисления. Объемы данных довольно большие. Тут нужна мощная СУБД. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2013, 16:37 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
andreybs, Про С++ тут нет ничего. Перенесу тему в C#, если нет возражений. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2013, 20:26 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
MasterZivandreybs, Про С++ тут нет ничего. Перенесу тему в C#, если нет возражений. Не возражаю. Модератор: Тема перенесена из форума "C++". ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2013, 23:25 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
andreybs, что приводит к использованию классов вместо структур, а значит перерасходу памяти и возможному снижению производительности. сколько байтов считали? Добавляет ли readonly property к размеру класса? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2013, 11:10 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
Изопропил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 есть и надо пользоваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2013, 11:22 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
WinnipuhSQLCLR есть и надо пользоваться. так топикстартеру не нравится. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2013, 11:36 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
Изопропил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 после очистки массива, чтобы высвободить память для повторного использования новым объектом. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2013, 00:18 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
ИзопропилWinnipuhSQLCLR есть и надо пользоваться. так топикстартеру не нравится. Я не против. Но хотел бы сделать это на С++. Но собрать сборку, которую схавает SQL пока не получилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2013, 00:22 |
|
высокопроизводительная CLR-сборка с кодом на C++ для SQL Server
|
|||
---|---|---|---|
#18+
andreybsоптимизировал как мог, чтобы сохранить читабельность кода при минимуме размеров не торопитесь с оптимизацией кода - оптимизируйте сначала алгоритм andreybsВыделил 4 типа данных T, для каждого из которых применил подобную модель особого смысла в выделении типа D - не вижу. Каковы отношения между четырьмя типами T и C? andreybsВсего одновременно живет до 1000 объектов (пока, в перспективе до 10000). 10000 - это очень мало. andreybsВсе управление классами делается на базе внешнего статического класса (экономим на таблице методов в каждом классе). ничего не экономим - все экземпляры класса используют одну общую таблицу методов andreybs1. Нужно ли ставить Parent=null, чтобы разорвать сильные связи объектов и облегчить работу сборщика мусора. облегчить таким способом нельзя. Если на экземпляр класса в программе нет никаких ссылок - мусоросборщика не волнует, на кого ссылается этот экземпляр. Рихтера почитайте. andreybs2. Нужно ли ставить Links.Capacity=0 после очистки массива, чтобы высвободить память для повторного использования новым объектом. нет, не нужно. Capacity влияет только на начальное выделение памяти для списка ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2013, 07:49 |
|
|
start [/forum/topic.php?fid=20&msg=38346552&tid=1404184]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
70ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 188ms |
0 / 0 |