我有一个程序(Windows服务),该程序从多个发件人处接收UDP数据(目前约20个)。每个发件人每10秒“突发”大约30行CSV数据。每天总共发送大约1200万行。
所有传入数据均存储在文本文件中,每天一次。每个文件的大小约为1 GB。但有时我们的每日文件只有〜180 MB。这是非常一致的-一个或另一个,从不介于两者之间。 因此,有时我们会丢失约80%的传入数据。
我已经验证,发件人总是发送大约相同数量的数据。因此它位于我们接收器中的某个位置。
UDP接收器基本上是这样构建的:
using (UdpClient client = new UdpClient(listenPort))
{
client.Client.ReceiveBufferSize = 8388608;
while (!cancellationTokenSource.Token.IsCancellationRequested)
{
var result = await client.ReceiveAsync().ConfigureAwait(false);
var textData = Encoding.ASCII.GetString(result.Buffer);
await dataHandler.Handle(textData);
}
}
dataHandler 是一个将所有行附加到文本文件中的类
public async Task Handle(string data)
{
using (StreamWriter writer = File.AppendText(Path.Combine(this.outputPath, GetFilename())))
{
await writer.WriteLineAsync(data);
}
}
private string GetFilename()
{
return DateTime.Now.ToString("yyyy-MM-dd") + ".csv";
}
在我进行其他研究之前:上面的代码中是否有任何内容可能导致我看到的问题? UDP侦听器还是文件写入?
编辑:数据丢失在白天是均匀分布的,所以我想知道这与文件写入有关吗?由于在午夜创建了新文件。为每行实例化一个新的StreamWriter是否足够有效?
答案 0 :(得分:0)
结果是,我正在寻找问题的错误答案。数据进入UDP套接字,数据写入文件。
关于重新启动程序解决了数据丢失的观察是错误的。而且还不是我做的-您不能相信任何人....:-)
程序正在VMWare虚拟机中运行,并且存储是SAN。我发现问题出在正在写入的文件中。有些文件放置在SAN内部的错误位置。如果我重命名或删除文件,以便自动创建一个新文件,则所有数据都会保存,并且不会丢失数据。
非常感谢对UDP部分有新见解的所有人。