0
私のCSVのサイズは4GBで、SQLサーバにインポートする必要があります。 私はそれが2000万行以上あると思います。何人かが1時間以内にこれを行う方法を私に教えたら、私はとても感謝しています。私はすでにやっている何をDBへの大きなCsvファイル
:
using (FileStream filestream = new FileStream(path, FileMode.Open, FileAccess.Read)) {
using (StreamReader reader = new StreamReader(filestream, Encoding.UTF8)) {
string line = "";
bool isHeader = true;
int counter = 0;
while ((line = reader.ReadLine()) != null) {
if (isHeader) {
model.Columns = line.Split(new string[] { "\t" }, StringSplitOptions.RemoveEmptyEntries);
isHeader = false;
continue;
} else {
if (Settings.Default.RonudSet != 0) {
LoadInDB(indicator,RoundDecimals(line));
} else {
LoadInDB(indicator, line);
}
}
cmd.ExecuteNonQuery();
counter++;
}
}
model.RowCount = counter;
model.ColumnsCount = model.Columns.Length;
}
}
return model;
}
マイDbのアップロード方法:
public void LoadInDB(char indicator, string key) {
using (SqlConnection conn = new SqlConnection(Settings.Default.DBconnection)) {
conn.Open();
try {
SqlCommand cmd = new SqlCommand("dbo.LipperFilesTestingInsertFileRowKey", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@FileRowKey", SqlDbType.NVarChar, 100));
cmd.Parameters["@FileRowKey"].Value = key;
cmd.Parameters.Add(new SqlParameter("@targetTableIndicator", SqlDbType.NVarChar, 100));
cmd.Parameters["@targetTableIndicator"].Value = indicator;
cmd.ExecuteNonQuery();
} catch (SqlException sqlExc) {
MyLog.WriteToLog(sqlExc.Message,MyLog.Messages.Error);
}
}
}
さらに、データセットとデータアダプタを介してデータをアップロードすることもできます。通常、個々の更新を遅くするのは、ログがフラッシュされるまでの待ち時間であり、それを考慮する必要があります。最も簡単な解決策は、バッチコミットだけです。例えば。 1000回の挿入ごと、または1秒ごとにコミットします。これにより、ログ・ページがいっぱいになり、トランザクション内のすべての挿入に対してコスト・ログ・ログ・フラッシュ待ち時間が償却されます。パフォーマンステストの場合と同様に、ランダム性を排除し、データベースとログをあらかじめ割り当てておくことをお勧めします.dbまたはログの増加イベントを回避する必要はありません。 –