在不丢弃数据包的情况下记录高频数据

2024-04-29 19:55:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我将QuickFix与python绑定一起使用,并将pandas用于数据管理。在

我处理这个问题已经有一段时间了,在SO或Google上没有找到任何与之相关的明确问题/答案。它与低延迟环境中的代码效率和体系结构有关。在

我正在记录财务数据。频率极高。在快速时间段内,(小尺寸)消息每隔15毫秒左右到达一次。QuickFix将每条消息传递给我编写的消息破解程序,它执行以下操作:

  1. 使用re解析消息
  2. 转换消息中每个元素的数据类型(本例中大约有8个元素)
  3. 用8个元素更新pandas数据框的值
  4. 在本地计算机上打开.csv文件,追加8个元素的行,关闭文件。在

一个相当简单的过程,但乘以几百个市场,结果是我的电脑无法处理。在每天2-100次之间的任何地方,电脑会窒息,离线,我会丢失大约20秒的数据(大约13000个样本!)在

我现在正在查看PyTables,看看是否可以加快进程。但我对计算机科学的了解还不足以真正触及速度问题的核心,我希望能有一些智慧。在

问题是.csv文件吗?我可以使用PyTables和HDF5来加快速度吗?做这种事的“正确”方式是什么?在


Tags: 文件csv数据答案代码消息元素pandas
1条回答
网友
1楼 · 发布于 2024-04-29 19:55:27

尝试将数据写入内存中的数据库或队列,或时间序列数据库,然后在以后持久化到磁盘上。从in mem databases或{a2}中尝试一些内容

或者简单地尝试将时间序列数据写入MSMQ或其他MQ。在

我现在读到Pandas是Python的一种内存数据库。没听说过。上面的列表里有很多!此外,要回答您的一些问题,正确的方法是考虑每个操作在每个“层”上的价格持久性。首先,你的网络IO操作将比你的CPU更昂贵。第二,你的网络很容易出现数据风暴,带宽会不堪重负。你需要一个大数据管道来应对突发事件。在

因此,每一条价格消息到达你的网络接口,必须在到达你的CPU之前通过TCP协议栈。UDP is quicker than TCP但如果您使用的是QuickFIX,您将使用TCP。在

然后,当数据报通过OSI layers展开时,它会到达CPU,CPU开始循环执行指令,假设CPU在其他地方不忙。在这里,基本上,如果你有任何IO(到磁盘或任何地方),你的CPU将旋转等待IO完成。如果您的进程优先级太低,操作系统可能context switch到另一个进程。或者,您的线程模型可能会导致太多的context switches,最好使用一个线程来处理这类事情,这样就没有任何线程了。在

要做到这一点,“正确”的方法是通过CPU从NIC获取数据,并将其放入MQ或内存空间。然后,你可以大容量写入数据库。。。(每分钟或任何你决定的事情)

相关问题 更多 >