Csharp/C#教程:写文件需要针对繁重的流量第2部分进行优化分享


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

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

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

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

代理API仅是单线程的。

void zf_TickEvent(object sender, ZenFire.TickEventArgs e) { outputString = string.Format("{0},{1},{2},{3},{4}rn", 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#足够智能搞清楚吗?

谢谢你的建议

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

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

上述就是C#学习教程:写文件需要针对繁重的流量第2部分进行优化分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/997621.html

(0)
上一篇 2021年12月26日
下一篇 2021年12月26日

精彩推荐