如果它包含100000行数据,如何在C#中编写超快的ascii文件?

时间:2011-07-28 17:51:54

标签: c#

我有一个代码,可以从C#中的随机类生成随机字符串和数字。然后将其写入文本文件。我怎样才能提高性能? 代码如下:

    int i = 0;
    Record[] rec = new Record[100000];
    Class1 cl = new Class1();
    Random random = new Random();
    while (i < 100000)
    {
        rec[i].num1 = random.Next();
        rec[i].num2 = random.Next();
        rec[i].mult = rec[i].num1 * rec[i].num2;
        rec[i].rel = true;
        rec[i].name = cl.generateRandomString(1);
        rec[i].var_set = cl.generateRandomString(2);          
        using (StreamWriter writer = new StreamWriter("important.txt", true))
        {

            writer.Write(rec[i].name);
            writer.Write("   ");
            writer.Write(rec[i].var_set);
            writer.Write("   ");
            writer.Write(rec[i].num1);
            writer.Write("   ");
            writer.Write(rec[i].num2);
            writer.Write("   ");
            writer.Write(rec[i].mult);
            writer.Write("   "); 
            writer.WriteLine(rec[i].rel);
        }
        i++;

5 个答案:

答案 0 :(得分:5)

根据你在@Ben评论中提供的代码,我得到了你正在使用的代码。

Record[] rec = new Record[100000]; 
Class1 cl = new Class1(); 
Random random = new Random(); 
while (i < 100000) 
{ 
    rec[i].num1 = random.Next();
    rec[i].var_set = cl.generateRandomString(2);
    using (StreamWriter writer = new StreamWriter("important.txt", true)) 
    { 
        writer.Write(rec[i].name); 
        writer.Write(" "); 
    } 
    i++;
}

我看到的最大问题是你正在为循环的每次迭代打开streamwriter。您可能希望将代码更改为类似的内容,以便文件只打开一次。

int i = 0;
Record[] rec = new Record[100000]; 
Class1 cl = new Class1(); 
Random random = new Random(); 
StreamWriter sr = new StreamWriter("important.txt", true);

try
{
    while (i < 100000) 
    { 
        rec[i].num1 = random.Next();
        rec[i].var_set = cl.generateRandomString(2);
        sr.Write(rec[i].name); 
        sr.Write(" "); 
        i++;
    }
}
finally
{
    sr.Close();
}

答案 1 :(得分:2)

执行此操作时会发生什么:

Record[] rec = new Record[100000]; 
Class1 cl = new Class1(); 
Random random = new Random(); 
int i = 0;
while (i < 100000) 
{ rec[i].num1 = random.Next(); rec[i].var_set = cl.generateRandomString(2); i++; };

i = 0;
using (StreamWriter writer = new StreamWriter("important.txt", true))
    {

        while ( i < 100000)
        {
        writer.Write(rec[i].name);
        writer.Write("   ");
        writer.Write(rec[i].var_set);
        writer.Write("   ");
        writer.Write(rec[i].num1);
        writer.Write("   ");
        writer.Write(rec[i].num2);
        writer.Write("   ");
        writer.Write(rec[i].mult);
        writer.Write("   "); 
        writer.WriteLine(rec[i].rel);

        i++;
        };
    }

编辑 - 另一种选择:

Record[] rec = new Record[100000]; 
Class1 cl = new Class1(); 
Random random = new Random(); 
int i = 0;
while (i < 100000) 
{ rec[i].num1 = random.Next(); rec[i].var_set = cl.generateRandomString(2); i++; };

File.WriteAllLines ( "important.txt", (from r in rec select r.name + "   " + 
r.var_set  + "   " + r.num1 + "   " + r.num2 + "   " + r.mult + 
"   " + r.rel).ToArray());

答案 2 :(得分:1)

System.IO.MemoryMappedFiles.MemoryMappedFile非常快。

但是,您的性能问题可能是由格式化输出引起的,而不是实际写入文件(启用磁盘写入缓存时文件写入非常快)。

答案 3 :(得分:0)

你真的应该花点时间编辑你的问题并包括评论中的代码。

这是您当前的代码,来自评论:

Record[] rec = new Record[100000]; 
Class1 cl = new Class1(); 
Random random = new Random(); 
while (i < 100000) 
{ 
    rec[i].num1 = random.Next();
    rec[i].var_set = cl.generateRandomString(2);
    using (StreamWriter writer = new StreamWriter("important.txt", true))
    { 
        writer.Write(rec[i].name); 
        writer.Write(" "); 
    } 
    i++; 
}

它有什么问题是你为外循环的每次迭代打开,写入和关闭文件100000次。

将开/关逻辑置于循环外:

Record[] rec = new Record[100000]; 
Class1 cl = new Class1(); 
Random random = new Random(); 
using (StreamWriter writer = new StreamWriter("important.txt", true))
{ 
    while (i < 100000) 
    { 
        rec[i].num1 = random.Next();
        rec[i].var_set = cl.generateRandomString(2);
        writer.Write(rec[i].name); 
        writer.Write(" "); 
        i++; 
    } 
}

答案 4 :(得分:0)

性能总是特定于应用程序,只有你才能真正定义什么是“超高速”。顺便提一下@Ben已经提供的解决方案之一就是拥有大量的数据,比如每块大约20,000行,并且用5个镜头写下它们,如果可以负担得起它们,就可以获得100.000行的一大块数据app,为什么不呢?也可能是一个很好的解决方案,但这是你的具体环境,所以Rico Mariani如何说:“衡量,衡量,衡量”。

问候。