C#, импортирующий большой объем данных от CSV до базы данных

Что является наиболее эффективным способом загрузить большие объемы данных из CSV (3 миллиона + строки) к базе данных.

  • Данные должны быть отформатированы (например, столбец имени должен быть разделен на имя и фамилию, и т.д.),
  • Я должен выполнить в этом эффективно как возможные т.е. ограничения времени

Я принимаю сторону опции чтения, преобразования и загрузки данных с помощью строки строкой приложения C#? Действительно ли это идеально, в противном случае каковы мои опции? Я должен использовать многопоточность?

11
задан guazz 14 April 2010 в 22:31
поделиться

7 ответов

Если вы действительно хотите сделать это на C #, создайте и заполните DataTable, обрежьте целевую таблицу db, затем используйте System.Data.SqlClient.SqlBulkCopy.WriteToServer (DataTable dt).

0
ответ дан 3 December 2019 в 10:03
поделиться

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

Кроме того, я бы предложил пакетную обработку операторов вставки (включение многих операторов вставки в одну строку) перед отправкой их в базу данных, если это не создаст проблем с получением значений сгенерированных ключей, которые вам нужно использовать для последующих внешних ключей (надеюсь, вам не нужно получать никаких значений сгенерированных ключей). Имейте в виду, что SQL Server (если вы используете именно его) может обрабатывать только 2200 параметров на пакет, поэтому ограничьте размер пакета с учетом этого. И я бы рекомендовал использовать параметризованные операторы TSQL для выполнения вставок. Я подозреваю, что больше времени будет потрачено на вставку записей, чем на их чтение из файла.

2
ответ дан 3 December 2019 в 10:03
поделиться

BCP довольно быстрый, поэтому я бы использовал его для загрузки данных. Для работы со строками я бы использовал CLR-функции на SQL, как только данные будут получены. Многопоточность не поможет в этом сценарии, только добавит сложности и ухудшит производительность.

0
ответ дан 3 December 2019 в 10:03
поделиться

Вы не указываете, какую базу данных вы используя, но, учитывая язык, который вы упомянули, является C #, я собираюсь использовать SQL Server.

Если данные не могут быть импортированы с помощью BCP (что кажется невозможным, если требуется значительная обработка), то SSIS, вероятно, будет следующим самым быстрым вариантом. Это не самая лучшая платформа для разработки в мире, но она очень быстрая. Конечно, быстрее, чем любое приложение, которое вы можете написать самостоятельно в разумные сроки.

1
ответ дан 3 December 2019 в 10:03
поделиться

Вы можете использовать csvreader , чтобы быстро прочитать CSV.

Предполагая, что вы используете SQL Server, вы используете csvreader CachedCsvReader для чтения данных в DataTable, который вы можете использовать с SqlBulkCopy для загрузки в SQL Server.

3
ответ дан 3 December 2019 в 10:03
поделиться

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

В прошлый раз, когда я делал это, это было около дюжины строк на C #. В одном потоке он запускал жесткий диск так быстро, как мог читать данные с пластин. Я читаю по одной строке из исходного файла.

Если вы не хотите писать это самостоятельно, вы можете попробовать библиотеки FileHelpers . Вы также можете ознакомиться с работой Себастьяна Лориона . Его читатель CSV написан специально для решения проблем с производительностью.

4
ответ дан 3 December 2019 в 10:03
поделиться

, который построчно считывает содержимое CSV-файла в DataTable в памяти. Вы можете манипулировать данными (например, разделять имя и фамилию) и т. Д. По мере заполнения DataTable.

После загрузки данных CSV в память используйте SqlBulkCopy для отправки данных в базу данных.

См. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.writetoserver.aspx для документации.

0
ответ дан 3 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: