Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将实时数据存储到1000个文件中_C#_Real Time - Fatal编程技术网

C# 将实时数据存储到1000个文件中

C# 将实时数据存储到1000个文件中,c#,real-time,C#,Real Time,我有一个程序可以接收1000个主题的实时数据。它平均每秒接收5000条消息。每条消息由两个字符串、一个主题和一个消息值组成。我想将这些字符串与指示消息到达时间的时间戳一起保存 我在“Core2”硬件上使用32位WindowsXP,并用C#编程 我想将这些数据保存到1000个文件中——每个主题一个。我知道很多人会想告诉我把数据保存到数据库中,但我不想走这条路 我考虑了几种方法: 1) 打开1000个文件,在数据到达时写入每个文件。我对此有两个担忧。我不知道是否有可能同时打开1000个文件,也不知道

我有一个程序可以接收1000个主题的实时数据。它平均每秒接收5000条消息。每条消息由两个字符串、一个主题和一个消息值组成。我想将这些字符串与指示消息到达时间的时间戳一起保存

我在“Core2”硬件上使用32位WindowsXP,并用C#编程

我想将这些数据保存到1000个文件中——每个主题一个。我知道很多人会想告诉我把数据保存到数据库中,但我不想走这条路

我考虑了几种方法:

1) 打开1000个文件,在数据到达时写入每个文件。我对此有两个担忧。我不知道是否有可能同时打开1000个文件,也不知道这会对磁盘碎片产生什么影响

2) 写入一个文件,然后——不知何故——稍后对其进行处理,生成1000个文件

3) 把它全部保存在RAM中直到一天结束,然后一次写一个文件。我认为如果我有足够的ram,这将很好地工作,尽管我可能需要移动到64位以超过2GB的限制


您将如何解决这个问题?

我想进一步探讨一下为什么您不使用DB—他们在这方面非常出色!但是关于你的选择

  • 1000个打开的文件句柄听起来不太好。忘记磁盘碎片-O/S资源将消耗殆尽
  • 这简直是一种疯狂!听起来麻烦也太多了
  • RAM=易失性。你整天都在积累数据,下午5点停电
  • 我将如何处理这个问题?DB!因为这样我可以查询索引、分析等等


    :)

    我将制作两个独立的程序:一个用于接收传入的请求,对其进行格式化并将其写入一个文件,另一个用于读取该文件并将请求写入。通过这种方式,您可以最大限度地减少打开的文件句柄数量,同时仍能实时处理传入的请求。如果第一个程序的输出格式正确,那么将其处理为单个文件应该很简单。

    首先计算带宽!5000条消息/秒,每2kb=10mb/秒。每分钟-600mb。你可以把它放在RAM里。然后每小时冲洗一次


    编辑:更正错误。对不起,我的错。

    我会考虑购买一个实时data historian软件包。类似于PI系统或Wonderware Data Historian。我以前在文件和MS SQL数据库中尝试过类似的东西,但结果并不好(这是客户的要求,我不建议这样做)。这些产品都有API,甚至还有软件包,您可以像查询SQL一样对数据进行查询

    它不允许我发布超链接,所以只需在谷歌上搜索这两个产品,你就能找到它们的相关信息

    编辑

    如果像大多数人那样使用数据库,我建议为每个历史数据推荐一个表,并考虑表分区、索引以及存储数据的时间。p> 例如,如果您要为每个主题存储一个天值及其一个表,那么您将看到每秒5次更新x每分钟60秒x每小时60分钟x 24小时=每天432000条记录。导出数据后,我认为您必须在第二天清除数据,这将导致锁定,因此您必须将写入数据库的数据排队。然后,如果要重建索引,以便可以对其执行任何查询,这将导致模式修改锁定和MS SQL Enterprise Edition用于联机索引重建。如果你不每天清除数据,你必须确保你有足够的磁盘空间


    基本上,我所说的是权衡购买可靠产品的成本和构建自己的产品的成本。

    我会保留一个传入消息的缓冲区,并定期在一个单独的线程上按顺序写入1000个文件。

    我无法想象你为什么不想为此使用数据库。这就是他们建造的目的。他们做得很好

    如果您不愿意这样做,那么可以选择将它们存储在RAM中,并每小时将它们旋转到磁盘上,但请记住,如果您被电源线绊倒,您会丢失大量数据

    真的。数据库

    编辑:我应该补充一点,如果您的硬件已经准备就绪,那么获得一个健壮、可复制且完整的数据库支持解决方案只需不到一天的时间


    在任何其他环境中执行此级别的事务保护都将花费您数周的时间进行设置和测试。

    我同意Kyle的观点,并使用类似PI的软件包产品。要知道PI是相当昂贵的

    如果你想找一个定制的解决方案,我会选择Stephen's,做一些修改。让一台服务器接收消息并将其放入队列。但是,您不能使用文件将消息传递给其他进程,因为您将经常遇到锁定问题。可能使用类似MSMQ(MS消息队列)的东西,但我不确定它的速度

    我还建议使用db来存储数据。不过,您需要将大量数据插入数据库,因为我认为您需要一些庞大的硬件来允许SQL每秒执行5000个事务。您最好每隔10000条累积在队列中的消息进行批量插入

    数据大小:

    平均消息~50字节-> small datetime=4字节+主题(~10个字符非unicode)=10字节+消息->31个字符(非unicode)=31字节


    50*5000=244kb/秒->14mb/分钟->858mb/小时

    像n8wrl一样,我也建议使用DB。但是如果你真的不喜欢这个功能

    让我们找到另一个解决方案;-)

    在一个最小的步骤,我会采取两个线程。首先是一个worker-one,接收所有数据并将每个o