字典串到文本文件

时间:2009-06-18 11:38:42

标签: c# text dictionary export

我正在尝试将stringdictionary导出到文本文件,它有超过一百万条记录,如果我使用循环,则导出到文本文件需要3分钟。

有没有办法更快地做到这一点?

此致

2 个答案:

答案 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();

显然,性能取决于写入的实际数据的大小。