powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / CLR & Framework 4.0 & MSSQL 2008 R2
25 сообщений из 31, страница 1 из 2
CLR & Framework 4.0 & MSSQL 2008 R2
    #38182721
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

Подскажите, возможно ли создать CLR библиотеку на Framework 4.0 и подгрузить ее на MSSQL 2008 R2 ?
Если да, то как ? С Framework 3.5 проблем нет.

Цель - использовать plinq, который доступе в Framework 4.0.
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38182787
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Testor1,

нет
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38182814
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ViPRos,

В MSSQL 2012 ?
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38183079
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Testor1Цель - использовать plinq, который доступе в Framework 4.0.За такие "цели" постановщику задачи "светит" пожизненная дисквалификация в дворники!
Додуматься заставить писать для SQL-сервера "плюшки", которые вместо серверного движка будут на этом же самом сервере выполнять недо-запросы на LINQ (хоть и Parallel) - бред редкостный...

Учите SQL и T-SQL - и будет Вам счастье! Вместе с самым быстрым и даже очень параллельным (в зависимости от версии, редакции и настроек SQL-сервера) выполнением запросов к данным. Аминь!
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38183467
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sphinx_mvTestor1Цель - использовать plinq, который доступе в Framework 4.0.За такие "цели" постановщику задачи "светит" пожизненная дисквалификация в дворники!
Додуматься заставить писать для SQL-сервера "плюшки", которые вместо серверного движка будут на этом же самом сервере выполнять недо-запросы на LINQ (хоть и Parallel) - бред редкостный...

Учите SQL и T-SQL - и будет Вам счастье! Вместе с самым быстрым и даже очень параллельным (в зависимости от версии, редакции и настроек SQL-сервера) выполнением запросов к данным. Аминь!

Речь не идет о стандартных запросах.
Иногда требуется обрабатывать данные (парсить) на уровне базы.
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38183505
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Testor1Речь не идет о стандартных запросах.
Иногда требуется обрабатывать данные (парсить) на уровне базы.
А пример моно? Ни и см. пост sphinx_mv... только "постановщику задачи" заменить на dbd

Хотя... полноценных регулярок нехватат... Иногда встречаются такие задачи...

P.S.: а парсить нуно... до того как данные ложатся в базу
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38183529
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buserTestor1Речь не идет о стандартных запросах.
Иногда требуется обрабатывать данные (парсить) на уровне базы.
А пример моно? Ни и см. пост sphinx_mv... только "постановщику задачи" заменить на dbd

Хотя... полноценных регулярок нехватат... Иногда встречаются такие задачи...

P.S.: а парсить нуно... до того как данные ложатся в базу

Согласен. Надо парсить до базы, но есть ограничение по времени ... Пока есть то, что есть
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38183558
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Testor1sphinx_mvпропущено...
За такие "цели" постановщику задачи "светит" пожизненная дисквалификация в дворники!
Додуматься заставить писать для SQL-сервера "плюшки", которые вместо серверного движка будут на этом же самом сервере выполнять недо-запросы на LINQ (хоть и Parallel) - бред редкостный...

Учите SQL и T-SQL - и будет Вам счастье! Вместе с самым быстрым и даже очень параллельным (в зависимости от версии, редакции и настроек SQL-сервера) выполнением запросов к данным. Аминь!

Речь не идет о стандартных запросах.Для серверов БД практически не существует "нестандартных запросов" - по крайней мере, мне такие не встречались. Все, что "нестандартное" (обычно касается очень сложных отчетов) реализуется несколько "более другими" средствами.
При этом элементарные (для SQL) типы запросов становятся весьма нетривиальными при попытке их реализации на LINQ.
Testor1Иногда требуется обрабатывать данные (парсить) на уровне базы.На уровне БД?
"Ремонтируйте" структуру данных, хранящихся в БД: при возникновении таких "задач" налицо нарушение основных правил проектирования реляционных БД. В частности, не соблюдается первая нормальная форма , и конкретно - ее условие, когда каждый столбец каждой записи должен содержать только одно значение из соотвествующего домена .
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38183586
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sphinx_mvTestor1пропущено...


Речь не идет о стандартных запросах.Для серверов БД практически не существует "нестандартных запросов" - по крайней мере, мне такие не встречались. Все, что "нестандартное" (обычно касается очень сложных отчетов) реализуется несколько "более другими" средствами.
При этом элементарные (для SQL) типы запросов становятся весьма нетривиальными при попытке их реализации на LINQ.
Testor1Иногда требуется обрабатывать данные (парсить) на уровне базы.На уровне БД?
"Ремонтируйте" структуру данных, хранящихся в БД: при возникновении таких "задач" налицо нарушение основных правил проектирования реляционных БД. В частности, не соблюдается первая нормальная форма , и конкретно - ее условие, когда каждый столбец каждой записи должен содержать только одно значение из соотвествующего домена .

Импортируются булк инсертом огромные csv файлы. Несколько 10-20 ГБ данных в файле. Некоторые из полей перед вставкой в базу нужно распарсить и удалить ненужные данные. В базу грузятся не все поля. Если писать отдельную программку для обработки файлов, то для обработки файлов тоже нужно время ... Короче спорный вопрос, что быстрее ... времени проводить экспериментов на данный момент нет, но в будущем такие тесты будут проведены.

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

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

Все уже реализовано на уровне OPENROWSET BULK INSERT + CLR. Есть возможность вторую задачу ускорить за счет plinq.
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38183805
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Testor1Импортируются булк инсертом огромные csv файлы. Несколько 10-20 ГБ данных в файле. Некоторые из полей перед вставкой в базу нужно распарсить и удалить ненужные данные. В базу грузятся не все поля. Если писать отдельную программку для обработки файлов, то для обработки файлов тоже нужно время ... Короче спорный вопрос, что быстрее ... времени проводить экспериментов на данный момент нет, но в будущем такие тесты будут проведены. "Лисапет" - оно, конечно, хорошо...
Только перед тем как "проводить тесты", ознакомьтесь (сугубо во избежание) с более стандартными и универсальными средствами, например, SQL Server Integration Services И (опять же во избежание) попробуйте все же сначала провести эксперименты и тесты, перед тем как совершенно непродуктивно тратить время на "окончательную разработку".

Кстати... Из каких соображений Вы предположили, что "парсинг данных в БД" займет меньше времени и ресурсов, чем парсинг и загрузка данных из внешнего приложения? Учтите, что объем вычислений и данных для обоих случаев одинаковый...
Testor1Вторая задача грузить не все строки, а только те которые прописаны в табличном справочнике (products_list) в базе данных.
И Вас ни разу не терзают смутные сомнения в правильности выбраной стратегии (грузить все это на сервер для обработки и фильтрации нужных данных)? :)
Testor1Третья задача подсчитать, сколько реально было строк файле и сколько из них импортировалось.Да... Интересная "диагностическая" информация... Но, по большому счету, совершенно бесполезная...
Testor1Все уже реализовано на уровне OPENROWSET BULK INSERT + CLR. Есть возможность вторую задачу ускорить за счет plinq.Стесняюсь спросить... А SQL сервер уже не умеет BULK INSERT без OPENROWSET ???
Использование "не тех" инструментов "не в тех" местах... В общем, "не взлетит" (с)
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38183888
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sphinx_mvTestor1Импортируются булк инсертом огромные csv файлы. Несколько 10-20 ГБ данных в файле. Некоторые из полей перед вставкой в базу нужно распарсить и удалить ненужные данные. В базу грузятся не все поля. Если писать отдельную программку для обработки файлов, то для обработки файлов тоже нужно время ... Короче спорный вопрос, что быстрее ... времени проводить экспериментов на данный момент нет, но в будущем такие тесты будут проведены. "Лисапет" - оно, конечно, хорошо...
Только перед тем как "проводить тесты", ознакомьтесь (сугубо во избежание) с более стандартными и универсальными средствами, например, SQL Server Integration Services И (опять же во избежание) попробуйте все же сначала провести эксперименты и тесты, перед тем как совершенно непродуктивно тратить время на "окончательную разработку".

Кстати... Из каких соображений Вы предположили, что "парсинг данных в БД" займет меньше времени и ресурсов, чем парсинг и загрузка данных из внешнего приложения? Учтите, что объем вычислений и данных для обоих случаев одинаковый...
Testor1Вторая задача грузить не все строки, а только те которые прописаны в табличном справочнике (products_list) в базе данных.
И Вас ни разу не терзают смутные сомнения в правильности выбраной стратегии (грузить все это на сервер для обработки и фильтрации нужных данных)? :)
Testor1Третья задача подсчитать, сколько реально было строк файле и сколько из них импортировалось.Да... Интересная "диагностическая" информация... Но, по большому счету, совершенно бесполезная...
Testor1Все уже реализовано на уровне OPENROWSET BULK INSERT + CLR. Есть возможность вторую задачу ускорить за счет plinq.Стесняюсь спросить... А SQL сервер уже не умеет BULK INSERT без OPENROWSET ???
Использование "не тех" инструментов "не в тех" местах... В общем, "не взлетит" (с)


1) Пытался написать свой лоадер на c#. openrowset - работал быстрее и был более универсальным. Использовал openrowset, а не bcp и bulk insert - по нескольким причинам. Возможность использовать формат файл и отсекать ненужные столбцы. Фильтрация по условию. С помощью "хитрого", но не совсем правильного запроса была возможность подсчитать кол-во строк в файле и тех, которые были проинсерчены. И самое главное - было удобно настраивать и контролировать все процессы и tsql. Когда нужно обработать и загрузить несколько файлов и загрузить их в определенном порядке, то проще это делать в одном месте. Это с учетом текущего опыта.
В базу попадало только 10 столбцов из 500. Только один столбец нужно было дополнительно парсить. Технически это было проще сделать на CLR.

2) Стандартные библиотеки c# медленные. Для небольших задач они подходят. На тяжелых задачах нужно использовать С. Времени не было на переключаться на С. Работа со строками там работает побыстрее.

3) Файлы содержат кол-во строк в файле. Нужно сверяться, что кол-во строк файле совпадает с именем файлы. Данные очень ценные и недопустимы были ошибки. Пришлось пойти на жертвы по скорости. На практике бывали случаи с неполными данными в файле.

4) SQL конечно умеет, но использовал то, что более подходило.


Встречный вопрос - SSIS на сколько медленее, чем bcp и позволяет ли он подсчитать кол-во строк файле и строк сколько было проинсерченно?
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38183895
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Testor1,

Есть понимание - как надо правильно все делать, но нужно свободное время и набраться опыта по определенным технологиям.
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38184158
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Testor1пропущено...
1) Пытался написать свой лоадер на c#. openrowset - работал быстрее и был более универсальным. Использовал openrowset, а не bcp и bulk insert - по нескольким причинам. Возможность использовать формат файл и отсекать ненужные столбцы. Фильтрация по условию. С помощью "хитрого", но не совсем правильного запроса была возможность подсчитать кол-во строк в файле и тех, которые были проинсерчены. И самое главное - было удобно настраивать и контролировать все процессы и tsql. Когда нужно обработать и загрузить несколько файлов и загрузить их в определенном порядке, то проще это делать в одном месте. Это с учетом текущего опыта.
Это все было еще в DTS от SQL2000...
Testor1В базу попадало только 10 столбцов из 500. Только один столбец нужно было дополнительно парсить. Технически это было проще сделать на CLR. Надеюсь, Вы отдаете себе отчет, что "проще" != "лучше"? С другой стороны, "работает - не трогай"... :)
Testor12) Стандартные библиотеки c# медленные. Для небольших задач они подходят. На тяжелых задачах нужно использовать С. Времени не было на переключаться на С. Работа со строками там работает побыстрее.
Немножко, как бы, заблуждение...
Есть "система", которая каждые 5 минут "выплевывает" пару-тройку гигабайт текста в CSV-формате...
Текст нужно распарсить, отфильтровать и агрегировать по определенным, достаточно нетривиальным условиям...
"Самописный" (на c#) загрузчик грузит это "счастье" примерно 30-40 секунд - полный цикл: чтение исходного файла... парсинг, фильтрация, агрегация - "на лету"... загрузка в БД... И все - "стандартное"...
Testor1Встречный вопрос - SSIS на сколько медленее, чем bcp и позволяет ли он подсчитать кол-во строк файле и строк сколько было проинсерченно?Зависит от того, что и как будете использовать и настраивать для загрузки данных...
Подключите нему bcp - будет так же... Подключите BULK INSERT - совсем другой "суп"... Плюс вопросы оптимизации массовой загрузки для БД никто не отменял...
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38184241
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sphinx_mvНемножко, как бы, заблуждение...
Есть "система", которая каждые 5 минут "выплевывает" пару-тройку гигабайт текста в CSV-формате...
Текст нужно распарсить, отфильтровать и агрегировать по определенным, достаточно нетривиальным условиям...
"Самописный" (на c#) загрузчик грузит это "счастье" примерно 30-40 секунд - полный цикл: чтение исходного файла... парсинг, фильтрация, агрегация - "на лету"... загрузка в БД... И все - "стандартное"...


Звучит просто и красиво :) А вы попробуйте. Я на практике пробывал. Может быть у вас опыта побольше.
Чего только стоит String.Split по производительности :) А всего одна строчка :)
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38185107
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Testor1,


Предлагаю всем спецам, предложить способ оптимизировать данный скрипт.
Он по времени разархивирует и обрабатывает данные медленнее, чем связка ungzip разархивации и импорта полученного файла через openrowset bulk insert в базу.
Скрипт был написан на скорую руку для теста и не претендует на роль "правильно" написанного.
Прошу дать реальные ценные рекомендации по оптимизации на реальном примере.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
using System;
using System.IO;
using System.IO.Compression;
using System.Text.RegularExpressions;
using System.Configuration;
using System.Collections.Specialized;
using System.Management;
using System.Xml;

namespace zip
{




    public class Program
    {



        public static void Main()
        {

            string directoryPath = @"C:\Projects\Test\ConsoleApplication1\ConsoleApplication1";

            DirectoryInfo directorySelected = new DirectoryInfo(directoryPath);

            foreach (FileInfo fileToDecompress in directorySelected.GetFiles("*.gz"))
            {
                Console.WriteLine(DateTime.Now);
                Decompress(fileToDecompress);
                Console.WriteLine(DateTime.Now);
            }
        }

        public struct PatternReplacement
        {
            public String Pattern;
            public String Replacement;
        }

        public static String RemoveUnusedInfo(String InputString, Int32[] Columns, PatternReplacement[] PatternReplacementStructure)
        {
            String[] OutputStrings = InputString.Split(new Char[] { '|' });
            String OutputString = "";

            foreach (Int32 column in Columns)
            {
                OutputString = OutputString + "|" + OutputStrings[column];
            }
            OutputString = OutputString.Remove(0, 1);

            foreach (PatternReplacement pr in PatternReplacementStructure)
            {
                Regex rgx = new Regex(pr.Pattern);
                OutputString = rgx.Replace(OutputString,pr.Replacement);
            }

            return OutputString;
        }

        public static void Decompress(FileInfo fileToDecompress)
        {
            using (FileStream originalFileStream = fileToDecompress.OpenRead())
            {
                string currentFileName = fileToDecompress.FullName;
                string newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length);

                using (StreamWriter decompressedFileStream = new StreamWriter(newFileName))
                {
                    using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress))
                    {
                        String read_line, write_line;
                        StreamReader reader = new StreamReader(decompressionStream);

                        Int32[] Columns = {0, 1, 3, 4, 5, 13, 25, 27, 30};
                        
                        PatternReplacement pr;

                        pr.Pattern = @"\[(([2-9]~)|(\d\d+~))(-?\d*(\.\d+)?~0?(\.0+)?)(~\d+)?\]";
                        pr.Replacement = @"";

                        PatternReplacement[] PR = new PatternReplacement[1];
                        PR[0] = pr;

                        while ((read_line = reader.ReadLine()) != null)
                        {
                            write_line = RemoveUnusedInfo(read_line, Columns, PR);
                            decompressedFileStream.WriteLine(write_line);   
                        }
                        Console.WriteLine("Decompressed: {0}", fileToDecompress.Name);
                    }
                }
            }
        }
    }
}
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38185562
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Testor1,

приложите архив с образцами ввода и вывода.
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38185603
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lelouch,


Пример две строчки из файлов выгрузок.
В реальности таких строк до 20 миллионов в одном файле, а таких несколько в день.
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38185732
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Testor1,

я не спец, но попробуйте так. Без String.Split во всяком случае
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38185752
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно еще выгоднее сделать 1 Replace по тексту результата, а не на каждую строчку
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38185972
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LelouchВозможно еще выгоднее сделать 1 Replace по тексту результата, а не на каждую строчку

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

Как я понимаю, системе нужно будет на каждый REPLACE выделять память для новой строки. А если строка большая, то будут тратиться значительные ресурсы на поиск и выделение памяти.
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38185989
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Testor1,

Внутри replace вполне может использоваться StringBuilder, а не String
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38186069
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LelouchTestor1,

Внутри replace вполне может использоваться StringBuilder, а не String

Даже если это так, то все равно нужно выделять память для новой обработанной строки и копировать части строк из старой в новую. Или я не прав ?
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38186083
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Testor1,

StringBuilder
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38186127
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати а зачем вообще регулярка? Убрать все кроме первой группы?
...
Рейтинг: 0 / 0
CLR & Framework 4.0 & MSSQL 2008 R2
    #38186134
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lelouch,

Я имел ввиду то, что скрыто от разработчика.
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / CLR & Framework 4.0 & MSSQL 2008 R2
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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