亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 C# 中有效地將列表中對象的屬性導出到 CSV?

如何在 C# 中有效地將列表中對象的屬性導出到 CSV?

C#
三國紛爭 2023-07-09 10:28:13
基本上我有一個需要編輯的數據庫導入/導出文件(文件有 140 萬行)。編輯速度相當快,盡管我必須遍歷所有行并檢查 2 個字段的長度是否正確,如果不正確,只需將其填充到正確的長度。我遇到的問題是導出到 csv 文件確實無效。我目前正在使用我創建的方法,該方法基本上創建一個字符串,然后使用列表中的每個對象創建一個新行(如下面的代碼所示)。問題是它進展得很慢。我猜它相當慢,因為列表中的所有對象都有 14 個參數被放入字符串中(代碼經過編輯,所以不是那么長)。但有什么辦法可以讓它更快嗎?public static string CsvExport(List<DataLine> inputList)        {            string exportString = "";            string delimiter = ";";            foreach (DataLine line in inputList)            {                exportString += line.SCREENINGREQUESTUNIQUEID + delimiter + line.REQUESTTIMESTAMP + "\n";            }            return exportString;        }
查看完整描述

2 回答

?
慕田峪9158850

TA貢獻1794條經驗 獲得超7個贊

第一的。使用正確的工具來完成工作 -?StringBuilder

var exportString = lines

? ? .Aggregate(

? ? ? ? new StringBuilder(),?

? ? ? ? (builder, line) =>?

? ? ? ? {

? ? ? ? ? ? builder.Append(line.SCREENINGREQUESTUNIQUEID);

? ? ? ? ? ? builder.Append(";");?

? ? ? ? ? ? builder.AppendLine(line.REQUESTTIMESTAMP);


? ? ? ? ? ? return builder;

? ? ? ? })

? ? .ToString();

請注意,帶有+運算符的字符串連接將在每次+使用時實例化新的字符串實例,其中先前的字符串實例仍將保留在內存中(對于 1M 行,這將變得很重要)。您可以StringBuilder有效地完成此操作,而無需實例化新對象,并使用整個文件所需的確切內存量,而無需復制以前的值,正如托馬斯在他的回答中提到的那樣。


第二。如果您將文本寫入文件,您可以使用StreamWriter以更節省內存的方式執行此操作(但可能速度效率不高)


using (var csv = new StreamWriter("pathToFile"))

{

? ? foreach (var line in lines)

? ? {

? ? ? ? csv.Write(line.SCREENINGREQUESTUNIQUEID);

? ? ? ? csv.Write(";");?

? ? ? ? csv.WriteLine(line.REQUESTTIMESTAMP);

? ? }

}


查看完整回答
反對 回復 2023-07-09
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

您說需要導出到 CSV 文件,但實際上,您導出到 RAM 中的字符串。

像您一樣在字符串上使用+=將創建至少 140 萬個臨時字符串,這些字符串都需要進行垃圾收集。如果每行有 100 個字符長,則內存吞吐量為

200?+?400?+?600?+?...

有 140 萬個術語。即 200 * sum(1..1.4M) 或 ~ 200 TB。以 DDR3 1333 = 10.6 GB/s 的速率計算,這將需要大約 20000 秒或 5:30 小時

使用StreamWriter寫入文件。這將為您節省大量 RAM 內存,減少內存并提高速度,因為在您仍在計算時就已經可以寫入磁盤了。


查看完整回答
反對 回復 2023-07-09
  • 2 回答
  • 0 關注
  • 136 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號