gpt4 book ai didi

具有多个发送者的 C# 单个 UDP 监听器提供数据问题

转载 作者:太空宇宙 更新时间:2023-11-03 14:47:09 25 4
gpt4 key购买 nike

我有一个程序(windows 服务)从多个发件人(目前约 20 个)接收来自 UDP 的数据。每个发件人每 10 秒“突发”大约 30 行 CSV 数据。每天总共发送大约 12.000.000 行。

所有传入数据都存储在文本文件中,每天一个。每个文件的大小约为 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 是否足够有效?

最佳答案

事实证明,我看错了问题的一端。数据通过 UDP 套接字传入,数据写入文件。

有关重启程序解决数据丢失的观察是不正确的。而且也不是我做的 - 你不能相信任何人.... :-)

程序运行在VMWare虚拟机中,存储为SAN。我发现问题出在正在写入的文件上。某些文件放置在 SAN 中的错误位置。如果我重命名或删除文件,那么会自动创建一个新文件,所有数据都会被保存,并且不会丢失数据。

非常感谢所有为 UDP 部分提供想法的人。

关于具有多个发送者的 C# 单个 UDP 监听器提供数据问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53673163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com