簡體   English   中英

C#將大量數據從CSV導入數據庫

[英]C# Importing Large Volume of Data from CSV to Database

從CSV(300萬+行)向數據庫加載大量數據的最有效方法是什么。

  • 需要格式化數據(例如,名稱列需要分為名字和姓氏等)
  • 我需要盡可能有效地做到這一點,即時間限制

我正在選擇使用C#應用程序逐行讀取,轉換和加載數據? 這是理想的,如果沒有,我有什么選擇? 我應該使用多線程嗎?

您將受I / O限制,因此多線程不一定會使其運行得更快。

上次我這樣做,它是十幾行C#。 在一個線程中,它運行硬盤的速度與從盤片讀取數據的速度一樣快。 我從源文件中一次讀取一行。

如果您不熱衷於自己編寫,可以嘗試使用FileHelpers庫。 您可能還想看看SébastienLorion的作品 他的CSV讀取器專門用於處理性能問題。

您可以使用csvreader快速讀取CSV。

假設您正在使用SQL Server,您可以使用csvreader的CachedCsvReader將數據讀入DataTable,您可以將其與SqlBulkCopy一起加載到SQL Server中。

我同意你的解決方案。 一次讀取一行文件應避免一次將整個文件讀入內存的開銷,這應該使應用程序快速有效地運行,主要是花時間從文件中讀取(相對較快)並解析行。 我要注意的一點是要注意你是否在CSV中嵌入了換行符。 我不知道您使用的特定CSV格式是否實際上可以在數據中的引號之間輸出換行符,但這當然會混淆此算法。

另外,我建議在將插入語句(包括許多插入語句包含在一個字符串中)之前將它們發送到數據庫,如果這不會在檢索生成的鍵值時出現問題,這些值需要用於后續的外鍵(希望你不要需要檢索任何生成的鍵值)。 請記住,SQL Server(如果這是您正在使用的)只能處理每批2200個參數,因此請將批量大小限制為此。 我建議使用參數化TSQL語句來執行插入。 我懷疑插入記錄所花費的時間比從文件中讀取記錄要多。

你沒有說明你正在使用哪個數據庫,但鑒於你提到的語言是C#,我將假設SQL Server。

如果無法使用BCP導入數據(如果需要進行大量處理,則聽起來不可能),那么SSIS可能是下一個最快的選擇。 它不是世界上最好的開發平台,但速度非常快。 當然比任何應用程序都快,你可以在任何合理的時間內寫自己。

BCP很快,所以我用它來加載數據。 對於字符串操作,一旦數據存在,我就會在SQL上使用CLR函數。 除了增加復雜性和損害性能之外,多線程在這種情況下無濟於事。

逐行讀取CSV文件的內容到內存DataTable中。 您可以在填充DataTable時操縱數據(即:拆分名字和姓氏)等。

將CSV數據加載到內存后,使用SqlBulkCopy將數據發送到數據庫。

有關文檔,請參閱http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.writetoserver.aspx

如果您真的想在C#中執行此操作,請創建並填充DataTable,截斷目標db表,然后使用System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable dt)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM