写文件需要针对繁重的流量第2部分进行优化

时间:2012-06-04 15:43:39

标签: c# optimization io

如果有兴趣看到我来自哪里,你可以参考第1部分,但没有必要。

write file need to optimised for heavy traffic

下面是我编写的代码片段,用于从代理API中捕获一些财务分析数据。代码将运行没有错误。我需要优化代码,因为在高峰时段,zf_TickEvent方法每秒调用次数超过10000次。我使用内存流来保存数据,直到达到一定的大小,然后将其输出到文本文件中。

代理API只是单线程的。

void zf_TickEvent(object sender, ZenFire.TickEventArgs e)
{

    outputString = string.Format("{0},{1},{2},{3},{4}\r\n",
                        e.TimeStamp.ToString(timeFmt),
                        e.Product.ToString(),
                        Enum.GetName(typeof(ZenFire.TickType), e.Type),
                        e.Price,
                        e.Volume);

    fillBuffer(outputString);

}

public class memoryStreamClass
{
    public static MemoryStream ms = new MemoryStream();
}

void fillBuffer(string outputString)
{

    byte[] outputByte = Encoding.ASCII.GetBytes(outputString);

    memoryStreamClass.ms.Write(outputByte, 0, outputByte.Length);

    if (memoryStreamClass.ms.Length > 8192)
    {
        emptyBuffer(memoryStreamClass.ms);
        memoryStreamClass.ms.SetLength(0);
        memoryStreamClass.ms.Position = 0;
    }
}

void emptyBuffer(MemoryStream ms)
{
    FileStream outStream = new FileStream("c:\\test.txt", FileMode.Append);

    ms.WriteTo(outStream);
    outStream.Flush();
    outStream.Close();
}

问题:

  1. 有什么建议可以让它更快吗?我将尝试改变缓冲区长度,但就代码结构而言,这(几乎)是最快的吗?

  2. 当内存流被填满并且我将其清空到文件时,新数据会发生什么?我在清空第一个缓冲区时是否需要实现第二个缓冲区来保存数据?或者c#足够智能搞清楚了吗?

  3. 感谢您的任何建议

2 个答案:

答案 0 :(得分:2)

执行此操作的最快方法是让一个(或多个)线程将byte[]放入BlockingCollection并让一个线程尽可能快地将项目输出并写入它们到一个文件。这样你的制作人和文件写作消费者完全脱钩了。你将能够承受非常高的负荷。

答案 1 :(得分:0)

至于第二个问题:由于你的程序是单线程的,因此当流刷新时,传入的数据将被忽略,因为执行流程将在刷新时停止。但我想你使用的框架是异步工作的。在这里你可能无法避免多线程。您必须同步对流的访问权限。正如@usr所说,最好的方法是实施生产者 - 消费者模式 多线程是一个高级主题,但它是现代编程必须要知道的。考虑学习它,不要忽视。