Что является наиболее эффективным способом загрузить большие объемы данных из CSV (3 миллиона + строки) к базе данных.
Я принимаю сторону опции чтения, преобразования и загрузки данных с помощью строки строкой приложения C#? Действительно ли это идеально, в противном случае каковы мои опции? Я должен использовать многопоточность?
Если вы действительно хотите сделать это на C #, создайте и заполните DataTable, обрежьте целевую таблицу db, затем используйте System.Data.SqlClient.SqlBulkCopy.WriteToServer (DataTable dt).
Я согласен с вашим решением. Чтение файла по одной строке за раз позволяет избежать накладных расходов на чтение всего файла в память сразу, что должно обеспечить быструю и эффективную работу приложения, в первую очередь за счет времени на чтение из файла (которое относительно быстрое) и разбор строк. Единственное предостережение, которое у меня есть для вас, - это следить за тем, не вставляете ли вы в CSV новые строки. Я не знаю, может ли конкретный формат CSV, который вы используете, действительно выводить новые строки между кавычками в данных, но это, конечно, может запутать алгоритм.
Кроме того, я бы предложил пакетную обработку операторов вставки (включение многих операторов вставки в одну строку) перед отправкой их в базу данных, если это не создаст проблем с получением значений сгенерированных ключей, которые вам нужно использовать для последующих внешних ключей (надеюсь, вам не нужно получать никаких значений сгенерированных ключей). Имейте в виду, что SQL Server (если вы используете именно его) может обрабатывать только 2200 параметров на пакет, поэтому ограничьте размер пакета с учетом этого. И я бы рекомендовал использовать параметризованные операторы TSQL для выполнения вставок. Я подозреваю, что больше времени будет потрачено на вставку записей, чем на их чтение из файла.
BCP довольно быстрый, поэтому я бы использовал его для загрузки данных. Для работы со строками я бы использовал CLR-функции на SQL, как только данные будут получены. Многопоточность не поможет в этом сценарии, только добавит сложности и ухудшит производительность.
Вы не указываете, какую базу данных вы используя, но, учитывая язык, который вы упомянули, является C #, я собираюсь использовать SQL Server.
Если данные не могут быть импортированы с помощью BCP (что кажется невозможным, если требуется значительная обработка), то SSIS, вероятно, будет следующим самым быстрым вариантом. Это не самая лучшая платформа для разработки в мире, но она очень быстрая. Конечно, быстрее, чем любое приложение, которое вы можете написать самостоятельно в разумные сроки.
Вы можете использовать csvreader , чтобы быстро прочитать CSV.
Предполагая, что вы используете SQL Server, вы используете csvreader CachedCsvReader
для чтения данных в DataTable, который вы можете использовать с SqlBulkCopy для загрузки в SQL Server.
Вы будете привязаны к вводу-выводу, поэтому многопоточность не обязательно заставит его работать быстрее.
В прошлый раз, когда я делал это, это было около дюжины строк на C #. В одном потоке он запускал жесткий диск так быстро, как мог читать данные с пластин. Я читаю по одной строке из исходного файла.
Если вы не хотите писать это самостоятельно, вы можете попробовать библиотеки FileHelpers . Вы также можете ознакомиться с работой Себастьяна Лориона . Его читатель CSV написан специально для решения проблем с производительностью.
, который построчно считывает содержимое CSV-файла в DataTable в памяти. Вы можете манипулировать данными (например, разделять имя и фамилию) и т. Д. По мере заполнения DataTable.
После загрузки данных CSV в память используйте SqlBulkCopy для отправки данных в базу данных.
См. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.writetoserver.aspx для документации.