第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在 C# 中有效地將列表中對(duì)象的屬性導(dǎo)出到 CSV?

如何在 C# 中有效地將列表中對(duì)象的屬性導(dǎo)出到 CSV?

C#
三國紛爭(zhēng) 2023-07-09 10:28:13
基本上我有一個(gè)需要編輯的數(shù)據(jù)庫導(dǎo)入/導(dǎo)出文件(文件有 140 萬行)。編輯速度相當(dāng)快,盡管我必須遍歷所有行并檢查 2 個(gè)字段的長(zhǎng)度是否正確,如果不正確,只需將其填充到正確的長(zhǎng)度。我遇到的問題是導(dǎo)出到 csv 文件確實(shí)無效。我目前正在使用我創(chuàng)建的方法,該方法基本上創(chuàng)建一個(gè)字符串,然后使用列表中的每個(gè)對(duì)象創(chuàng)建一個(gè)新行(如下面的代碼所示)。問題是它進(jìn)展得很慢。我猜它相當(dāng)慢,因?yàn)榱斜碇械乃袑?duì)象都有 14 個(gè)參數(shù)被放入字符串中(代碼經(jīng)過編輯,所以不是那么長(zhǎng))。但有什么辦法可以讓它更快嗎?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貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊

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

var exportString = lines

? ? .Aggregate(

? ? ? ? new StringBuilder(),?

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

? ? ? ? {

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

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

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


? ? ? ? ? ? return builder;

? ? ? ? })

? ? .ToString();

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


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


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

{

? ? foreach (var line in lines)

? ? {

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

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

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

? ? }

}


查看完整回答
反對(duì) 回復(fù) 2023-07-09
?
眼眸繁星

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊

您說需要導(dǎo)出到 CSV 文件,但實(shí)際上,您導(dǎo)出到 RAM 中的字符串。

像您一樣在字符串上使用+=將創(chuàng)建至少 140 萬個(gè)臨時(shí)字符串,這些字符串都需要進(jìn)行垃圾收集。如果每行有 100 個(gè)字符長(zhǎng),則內(nèi)存吞吐量為

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

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

使用StreamWriter寫入文件。這將為您節(jié)省大量 RAM 內(nèi)存,減少內(nèi)存并提高速度,因?yàn)樵谀栽谟?jì)算時(shí)就已經(jīng)可以寫入磁盤了。


查看完整回答
反對(duì) 回復(fù) 2023-07-09
  • 2 回答
  • 0 關(guān)注
  • 158 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)