私がどこから来たのか知りたい人は、パート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();
}
質問:
これをさらに速くするための提案はありますか?バッファの長さを変えようとしますが、コード構造の観点から、これは(ほぼ)最速ですか?
メモリストリームがいっぱいになり、それをファイルに空にすると、入ってくる新しいデータはどうなりますか?最初のバッファーを空にしている間、そのデータを保持するために2番目のバッファーを実装する必要がありますか?それとも、C#はそれを理解するのに十分賢いですか?
アドバイスありがとうございます