在插入到sql server之前,C#处理并分析大量数据

时间:2013-10-22 12:08:09

标签: c# sql sql-server memory bulkinsert

我需要编写一个c#应用程序来监视通过网络接收的不同数据包(xml格式)。

每分钟可收到数万个数据包,每个数据包都需要检查以确定适当的行动。

该应用程序将监控工作人员在建筑物中的移动和动作。

数据包类似于以下内容:

Movement数据包:

<packet>
   <datetime>12:01:25</datetime>
   <usertag>ABC</usertag>
   <movedir>IN</movedir>    
   <location>90</location>
   ...
</packet>

Action数据包:

<packet>
    <datetime>12:07:45</datetime>
    <usertag>ABC</usertag>
    <actionid>1</movedir>
    .....
</packet>

应用程序需要:

  • 执行预过滤以确保仅处理所需的数据包(不处理重复/不相关的数据包)
  • 记录所有用户移动(时间/出时/用户/位置)
  • 记录发生操作的所有操作和位置(不是“操作”数据包的一部分需要从当前位置确定)
  • 当用户离开某个位置以确保他们在该位置执行正确的作业序列(“操作”)并记录此信息时的附加处理

所有信息都需要记录在SQL Server数据库中以进行报告。

我的困境是如何以最有效的方式实现上述目标。

由于要处理和写入SQL会有大量数据,我的计划是每隔X秒“队列”插入和批量插入(BulkCopy)。

我的想法......

  • 用户线程1读取所有数据包(我应该读取内存,即List<Packet>还是写入DAT文件?)

  • 主线程进程迭代上面的集合

    • 确定是否移动或操作包
    • 如果移动添加到List<Movement>

      对于其中的每一个,我需要在数据库表上进行查找以将位置代码映射到ID(我应该将此位置列表批量读取到字典一次并每隔X秒刷新一次吗?)

    • 如果操作添加到List<Action> 对于其中的每一个,我需要在数据库表/内存对象(上面)上查找,以查看用户当前在哪个位置记录此内容
    • 当Out Movement Complete获取所执行的操作列表并应用规则(在db中保存)以确保所有工作都已执行
    • 每隔X秒批量插入和刷新列表

我担心通过这个过程我将在内存中保存的信息量非常大。任何人都有关于如何更有效地实现这一目标的任何建议?我希望将业务逻辑保留在代码中而不是服务器上。

非常感谢! 汤姆

0 个答案:

没有答案