【问题标题】:How do i store real-time data如何存储实时数据
【发布时间】:2013-05-22 17:12:24
【问题描述】:

我正在使用 .net 框架 4.0 以 Windows 形式开发股票市场应用程序。我正在从交易所实时获取报价。我能够实时接收报价。在我的场景中,我必须创建一个线程,它将在通用集合中写入实时提要,而其他持续运行的后台线程将从集合中获取它并进行进一步处理。为了实现这一点,我使用了 ConcurrentDictionary 和 ConcurrentQueue 的组合。键包含符号名称和值包含 ConcurrentQueue。这就是它的实现方式Check first answer

这工作得很好我唯一担心的是延迟。由于股票价格必须实时波动,此过程会导致 1 秒延迟。这种情况是否可以通过其他逻辑实现,或者我可以通过某种方式提高 ConcurrentDictionary 或 ConcurrentQueue 的性能以避免延迟?

【问题讨论】:

  • 你还没有做任何诊断。从基础开始:究竟是什么导致了延迟?锁争用或其他同步开销?还是您自己处理?
  • (如果这不是 C#,并且如果您不需要数据存档,我会建议查看 rrdtool,这是一个明确设计用于存储固定数量的高性能。)
  • 从 concurrentDictionary 或 concurrentqueue 写入或读取导致延迟

标签: .net winforms c#-4.0


【解决方案1】:

您真的需要并发字典吗?仅当您找到新符号时,您的字典才会更改。如果您碰巧事先知道所有符号,则可以创建一个普通字典,为每个符号填充一个队列,仅此而已 - 字典永远不会改变。

不过,我不确定您的处理线程是如何工作的 - 它如何知道接下来要查看哪个队列?它是否会遍历所有队列以查看是否还有更多数据?也许您需要的只是一个ConcurrentQueue,它将保存所有股票市场事件,并在后台将其分成单独的容器(可能没有同步)。

【讨论】:

  • 如果我使用普通字典,它将是线程安全的,因为多个线程将从队列中入队和出队数据。
  • 普通字典对于并发读取操作是安全的,只要没有人改变它。您无需更改字典,只需更改队列 - 字典还是一样的。
【解决方案2】:

为什么不将一个包含 stmbol-id 和相应 Page 的对象入队,由工作线程出列(不为每个符号 id 分配专用线程),然后工作线程将页面发送到使用简单的 switch case 语句根据符号 id 正确处理。

这样,您不必检查符号是否存在队列。您将只有一个类型的线程安全队列,并且您可以使用 ThreadPool 进行处理!

工作线程会这样做:

IdPagePair pair = market.Dequeue();

if (pair.Id == 1) { Process1(pair.Page); }

else 

if (pair.Id == 2) { Process2(pair.Page); }

// etc...

【讨论】:

  • “一对”是什么意思?
  • 一对将是一个具有两个属性的类:一个符号 id 和一个关联的 Page。
猜你喜欢
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 2021-07-04
  • 1970-01-01
  • 2019-09-06
相关资源
最近更新 更多