С# Импорт большого объема данных из CSV в базу данных

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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