1

私がどこから来たのか知りたい人は、パート1を参照してください。ただし、必須ではありません。

書き込みファイルは、トラフィックが多い場合に最適化する必要があります

以下は、ブローカーAPIからいくつかの金融ダニデータをキャプチャするために私が書いたコードのスニペットです。コードはエラーなしで実行されます。ピーク時には、zf_TickEventメソッドが1秒間に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. メモリストリームがいっぱいになり、それをファイルに空にすると、入ってくる新しいデータはどうなりますか?最初のバッファーを空にしている間、そのデータを保持するために2番目のバッファーを実装する必要がありますか?それとも、C#はそれを理解するのに十分賢いですか?

アドバイスありがとうございます

4

2 に答える 2

2

これを行う最も速い方法は、1つ(または複数)のスレッドをに入れbyte[]BlockingCollection1つのスレッドで可能な限り高速にアイテムを取り出してファイルに書き込むことです。そうすれば、プロデューサーとファイル作成コンシューマーは完全に切り離されます。そうすることで、非常に高い負荷に耐えることができます。

于 2012-06-04T15:47:18.643 に答える
0

2番目の質問については、プログラムはシングルスレッドであるため、実行フローがフラッシュで停止するため、ストリームがフラッシュされている間、着信データは無視されます。ただし、使用するフレームワークは非同期で機能すると思います。ここでは、マルチスレッドを回避できない場合があります。ストリームへのアクセスを同期する必要があります。そして最良の方法は、@ usrが言ったように、生産者/消費者パターンを実装することです。
マルチスレッドは高度なトピックですが、最新のプログラミングでは知っておく必要があります。それを学ぶことを検討し、無視しないでください。

于 2012-06-09T04:37:32.040 に答える