我正在尝试将stringdictionary导出到文本文件,它有超过一百万条记录,如果我使用循环,则导出到文本文件需要3分钟。
有没有办法更快地做到这一点?
此致
答案 0 :(得分:4)
嗯,这取决于您用于导出的格式,但一般来说,导出大量数据的最大开销是I / O.您可以通过使用更紧凑的数据格式,并尽可能减少对内存中数据的操作(以避免内存副本)来减少这种情况。
首先要检查的是查看磁盘I / O速度,并对编写代码进行一些分析。
如果您的磁盘I / O最大化(例如,在现代系统上以相当于每秒数十兆字节的磁盘速度写入),您可以考虑在写入之前压缩数据它。这会占用更多的CPU,但是在执行此操作时,您可以减少对磁盘的写入。如果您在阅读方面遇到相同的瓶颈,这也可能会提高读取文件的速度。
如果您的CPU最大化,则需要在编写数据之前对数据进行较少的处理工作。例如,如果您正在使用序列化库,那么避免使用序列化库并切换到更简单,更专业的数据格式可能会有所帮助。考虑一下你需要的最简单的格式:可能只是字符串长度的一个单词,后跟字符串数据本身,为每个键和值重复。
答案 1 :(得分:3)
请注意,大多数字典构造都不保留插入顺序 - 如果你想要可重复的文件内容,这通常会使它们选择不好,但是(取决于大小)我们可能会在时间上改进.... (下面)需要大约3.5秒(用于导出)写入不到30MB:
StringDictionary data = new StringDictionary();
Random rand = new Random(123456);
for (int i = 0; i < 1000000; i++)
{
data.Add("Key " + i, "Value = " + rand.Next());
}
Stopwatch watch = Stopwatch.StartNew();
using (TextWriter output = File.CreateText("foo.txt"))
{
foreach (DictionaryEntry pair in data)
{
output.Write((string)pair.Key);
output.Write('\t');
output.WriteLine((string)pair.Value);
}
output.Close();
}
watch.Stop();
显然,性能取决于写入的实际数据的大小。