交易订单簿更新和计算

时间:2015-06-06 14:02:11

标签: c# dictionary

我正在努力建立2级订单。

我正在使用“并发字典”分别存储出价和提问的数据。

我正在使用UDP侦听器读取数据包数据,在处理完数据包后,我将更新传递给出价/询问字典到任务。

这种方法很好,更新很快,但看起来很笨拙。

当我需要对Orderbook进行任何计算时,我必须锁定它进行计算,考虑到它的并发字典,这似乎是一件坏事。我觉得我正在减慢一切违背目的的事情。

您如何建议我解决锁定问题并减慢更新以对数据进行计算?

抱歉,我目前无法发布代码,但我不能停止思考如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

设计已经达到了仅使用一个数据仓的局限性。因此,我建议更改设计以容纳两个孤岛和数据管理器。

主要目标应该是及时但安全地进行所需的计算操作,然后专注于任何不应被阻止的数据输入。

在这个设计中有三个线程,一个管理器和两个数据孤岛。

数据输入

ConcurrentQueue的帖子会将所有传入数据enqueue存储到ConcurrentQueue Class。该存储孤岛将以 FIFO 方式处理数据的并发需求。

数据管理器

第二个线程运行一个数据管理器单例,它将 smurf TryDequeue)数据从数据输入Orderbook转移到最终的孤岛。由于传入数据位于队列中,因此可以节流穿过此虚拟网桥的记录总数,以达到可以测量/监控的标准性能。

最终数据仓(while (file >> ss) { if (isalpha((unsigned char)ss[0]) names.push_back(ss); else { std::istringstream buf(ss); int n; while (buf >> n) numbers.push_back(n); } }

求和操作的最后一个线程是数据最终驻留的位置。数据本身可以是标准字典,它将由数据管理器或求和过程锁定。然后,可以通过数据管理器改变访问优先级以支持求和过程,反之亦然;这将取决于该行动的最终需求。

通过该设计,数据输入被解锁,并且求和操作优先于测量方式的数据输入。