2012-06-04 28 views
1

對於任何有興趣查看我來自哪裏的人都可以參考第1部分,但這不是必需的。寫文件需要針對繁重的流量進行優化第2部分

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. 當MemoryStream的被填滿,我就清空該文件,會發生什麼樣的新的數據來了呢?當我清空我的第一個緩衝區時,是否需要實現第二個緩衝區來保存這些數據?或者說c#足夠聰明地搞清楚了嗎?

感謝您的任何意見

回答

2

做到這一點,最快的方法就是有一個(或多個)線程把byte[]的成BlockingCollection,並有一個線程需要的物品了儘可能快可能可以將它們寫入文件。這樣你的生產者和文件寫作用戶就完全分離了。你將能夠承受非常高的負荷。

+0

@ USR我想到過,多線程,但它是否將是太難爲別人是誰寫他們的第一個程序? –

+0

是的,可能:)如果你不使用多線程,你所能做的就是優化代碼並嘗試使用緩衝區大小。 – usr

+0

任何有興趣的人請參閱我的問題的第3部分

0

至於第二個問題:因爲你的程序是單線程之一,傳入的數據將被忽略,而我sbeing滿臉通紅,因爲執行流程將在沖洗停止流。但我想你使用的框架是異步工作的。在這裏你可能不會避免多線程。您將不得不同步訪問您的流。正如@usr所說,最好的方法是實施生產者 - 消費者模式。
多線程是一個高級主題,但它是現代編程中必須瞭解的。考慮學習它,不要忽視。

相關問題