【问题标题】:Write file need to optimised for heavy traffic part 2写入文件需要针对大流量进行优化第 2 部分
【发布时间】:2012-06-04 15:43:38
【问题描述】:

任何有兴趣了解我来自哪里的人都可以参考第 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# 足够聪明才能弄清楚?

感谢您的建议

【问题讨论】:

    标签: c# optimization io


    【解决方案1】:

    最快的方法是让一个(或多个)线程将byte[] 放入BlockingCollection 并让一个线程尽可能快地取出项目并将它们写入文件。这样你的生产者和文件写入消费者就完全解耦了。这样做您将能够承受非常高的负载。

    【讨论】:

    • @usr 我也在想,多线程,但是对于正在编写第一个程序的人来说会不会太难?
    • 是的,可能 :) 如果您不使用多线程,那么您所能做的就是优化代码并试验缓冲区大小。
    • 任何有兴趣的人请参考我的问题的第 3 部分 stackoverflow.com/questions/11526856/…>
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-07-16
      • 2012-07-17
      • 1970-01-01
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多