Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выбор оптимального метода импорта CSV в таблицу с предварительной обработкой данных  [new]
Testor1
Member

Откуда:
Сообщений: 679
Всем привет!

Требуется импортировать 100ГБ csv файл в таблицу.

Структура файла указан ниже
phrase1;phrase2;phrase2;[word1|word2|word3]

Структура таблицы
Col1|Col2|Col3|Col4|Col5|Col6

Последний столбец CSV файла должен дополнительно парситься, а результат записываться в столбцы (Col4, Col5, Col6)

Вопрос:
Каким методом можно максимально быстро загрузить данные в таблицу, если требуется их предварительная обработка?
18 дек 11, 12:54    [11784406]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимального метода импорта CSV в таблицу с предварительной обработкой данных  [new]
abrashka
Member

Откуда:
Сообщений: 521
Testor1,

Не уверен, что это "максимально быстро", но как вариант:
Пакет SSIS с использованием Derrived Column для вычисления Col4, Col5, Col6.
18 дек 11, 13:39    [11784508]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимального метода импорта CSV в таблицу с предварительной обработкой данных  [new]
Testor1
Member

Откуда:
Сообщений: 679
abrashka,

Варианты
1. Openrowset + TSQL функция для парсинга
2. Openrowset + CLR функция для парсинга
3. C# + ADO.NET
18 дек 11, 15:59    [11784764]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимального метода импорта CSV в таблицу с предварительной обработкой данных  [new]
aleks2
Guest
1.
The bcp utility bulk copies data between an instance of Microsoft SQL Server and a data file in a user-specified format. The bcp utility can be used to import large numbers of new rows into SQL Server tables or to export data out of tables into data files. Except when used with the queryout option, the utility requires no knowledge of Transact-SQL. To import data into a table, you must either use a format file created for that table or understand the structure of the table and the types of data that are valid for its columns. 

2. Загружаешь в таблицу, добавляешь две колонки, парсишь 4-ю в 4,5,6.
18 дек 11, 16:49    [11784894]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимального метода импорта CSV в таблицу с предварительной обработкой данных  [new]
Testor1
Member

Откуда:
Сообщений: 679
aleks2
1.
The bcp utility bulk copies data between an instance of Microsoft SQL Server and a data file in a user-specified format. The bcp utility can be used to import large numbers of new rows into SQL Server tables or to export data out of tables into data files. Except when used with the queryout option, the utility requires no knowledge of Transact-SQL. To import data into a table, you must either use a format file created for that table or understand the structure of the table and the types of data that are valid for its columns. 

2. Загружаешь в таблицу, добавляешь две колонки, парсишь 4-ю в 4,5,6.


ну про bcp я давно знаю.
сложность 4-ой колонки - это переменная типа varchar(2000) и кол-во разбиваемых значений не 3, а 20. В вопросе я для примера указал всего лишь 3 колонки.

В реальной задаче не все поля 4-ой колонки необходимо сохранить в таблицу. Часть данных из 4-ой колонки необходимо преобразовать из текстового значения в численное перед сохранением в таблицу.
18 дек 11, 19:54    [11785221]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимального метода импорта CSV в таблицу с предварительной обработкой данных  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Чёта я не понял в чём подвох то? Используем файл форматирования для BCP и грузим все 6 полей (23 поля). Остальное дропаем.

Но лучше скриптик или прожку "пластической хирургии" для файло (CSV -> CSV). И лишь потом грузим в таблу начисто. Намного более эффективнее и быстее.
18 дек 11, 22:55    [11785919]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимального метода импорта CSV в таблицу с предварительной обработкой данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31957
Mnior
Чёта я не понял в чём подвох то? Используем файл форматирования для BCP и грузим все 6 полей (23 поля).
ТС нужно делать вычисления и преобразования полей.

Mnior
Но лучше скриптик или прожку "пластической хирургии" для файло (CSV -> CSV).
Тоже хороший вариант
19 дек 11, 00:55    [11786300]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимального метода импорта CSV в таблицу с предварительной обработкой данных  [new]
Testor1
Member

Откуда:
Сообщений: 679
Mnior
Но лучше скриптик или прожку "пластической хирургии" для файло (CSV -> CSV). И лишь потом грузим в таблу начисто. Намного более эффективнее и быстее.


Вариант csv->csv с последующим bulk insert csv будет быстрее чем csv -> mssql через С# ADO BulkInsert?
19 дек 11, 09:38    [11786745]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимального метода импорта CSV в таблицу с предварительной обработкой данных  [new]
mike909
Member

Откуда:
Сообщений: 662
Testor1
Mnior
Но лучше скриптик или прожку "пластической хирургии" для файло (CSV -> CSV). И лишь потом грузим в таблу начисто. Намного более эффективнее и быстее.


Вариант csv->csv с последующим bulk insert csv будет быстрее чем csv -> mssql через С# ADO BulkInsert?

Мой вариант с OpenRowSet(bulk) загрузки структурированного бинарного (не CSV) файла оказался быстрее студенческой поделки на .NET bin->csv -> bulk insert.
Так что все относительно драйвера "руки"
А вообще, я не заметил заметного замедления при переходе с bulk insert на OpenRowSet(bulk).
Где-то видел статейку с замерами скорости загрузки, так в ней говорилось, что OpenRowSet(bulk) работает немного дольше bulk insert.
19 дек 11, 11:42    [11787511]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимального метода импорта CSV в таблицу с предварительной обработкой данных  [new]
Testor1
Member

Откуда:
Сообщений: 679
mike909
Testor1
пропущено...


Вариант csv->csv с последующим bulk insert csv будет быстрее чем csv -> mssql через С# ADO BulkInsert?

Мой вариант с OpenRowSet(bulk) загрузки структурированного бинарного (не CSV) файла оказался быстрее студенческой поделки на .NET bin->csv -> bulk insert.
Так что все относительно драйвера "руки"
А вообще, я не заметил заметного замедления при переходе с bulk insert на OpenRowSet(bulk).
Где-то видел статейку с замерами скорости загрузки, так в ней говорилось, что OpenRowSet(bulk) работает немного дольше bulk insert.


У меня есть предположение, что bcp или tsql openrowset(bulk) будет работать быстрее, чем ado.net (bulkinsert) из-за недокументированных возможностей используемых разработчиками MSSQL.
19 дек 11, 12:56    [11788078]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимального метода импорта CSV в таблицу с предварительной обработкой данных  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Testor1
У меня есть предположение, что bcp или tsql openrowset(bulk) будет работать быстрее, чем ado.net (bulkinsert) из-за недокументированных возможностей используемых разработчиками MSSQL.
Откуда дровишки про недокументированные возможности? Протокол TDS уже отреверсен, и даже есть сторонние реализации. Нечему (и негде) недокументированному там прятаться.

Может, просто, ado.net реализация может быть медленней, потому что там слишком много документированных возможностей используется?
19 дек 11, 13:06    [11788174]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимального метода импорта CSV в таблицу с предварительной обработкой данных  [new]
Glory
Member

Откуда:
Сообщений: 104751
Testor1
У меня есть предположение, что bcp или tsql openrowset(bulk) будет работать быстрее, чем ado.net (bulkinsert)

А вы уверены, что bcp и ado.net (bulkinsert) вообще одно и тоже ?
19 дек 11, 13:24    [11788396]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимального метода импорта CSV в таблицу с предварительной обработкой данных  [new]
Testor1
Member

Откуда:
Сообщений: 679
Glory
Testor1
У меня есть предположение, что bcp или tsql openrowset(bulk) будет работать быстрее, чем ado.net (bulkinsert)

А вы уверены, что bcp и ado.net (bulkinsert) вообще одно и тоже ?


Нет не уверен. Я как раз то и думаю, что первое будет работать быстрее.
19 дек 11, 15:47    [11790023]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимального метода импорта CSV в таблицу с предварительной обработкой данных  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Testor1
Вариант csv->csv с последующим bulk insert csv будет быстрее чем csv -> mssql через С# ADO BulkInsert?
Преобразование csv -> csv происходит быстрее чем копирование/распаковка (или у вас все процы под 110% увязли), так что:
1. добавление этой прокладки в потоки данных добавит 0 пикосекунд задержки (главное чтоб руки росли из нужного места)
2. рассмотрение чего либо отдельно от всего процесса сродни коню в вакууме

И главное, максимальная модульность системы. Юникс вэй. (хотя не каждая хрень в окошках пипелайн поддерживает).
20 дек 11, 01:47    [11793230]     Ответить | Цитировать Сообщить модератору
 Re: Выбор оптимального метода импорта CSV в таблицу с предварительной обработкой данных  [new]
Testor1
Member

Откуда:
Сообщений: 679
Mnior,

Нашел статейку
[url=]http://msdn.microsoft.com/ru-ru/library/dd425070(d=printer,v=sql.100).aspx[/url]

Решил пойти по пути csv->mssql на базе c#+ado.net
Планирую максимально минимизировать использование каких либо "облегчающих" функций типа readline и регулярных выражений.

Пытаюсь разобраться как организовать асинхронную загрузку данных в базу. Не было опыта работы с асинхронной обработкой данных :(

Хочу получить следующее
1. Загрузить порцию в буфер (50MB) с помощью FileStream.Read
2. преобразовать данные из буфера и грузить их в mssql
3. параллельно с обработкой пункт 2. запустить процесс пункт 1., но в другой буфер.
4. обрабатываем пункты с 1-3 до конца файла.
21 дек 11, 09:27    [11800748]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить