记录高频数据而不丢包
Recording high frequency data without dropping packets
我正在使用带有 python 绑定的 QuickFix,以及用于数据管理的 pandas。
我已经处理这个问题一段时间了,在 SO 或 Google 上没有找到任何明确的 questions/answers 与之相关。它涉及低延迟环境中的代码效率和架构。
我正在记录财务数据。这是非常高的频率。在快速期间,(小型)消息每 15 毫秒左右到达一次。 QuickFix 将每条消息传递给我编写的消息破解程序,它执行以下操作:
- 用
re
解析消息
- 转换消息每个元素的数据类型(在本例中大约有 8 个)
- 用 8 个元素更新 pandas 数据框的值
- 在本地计算机上打开一个
.csv
文件,追加 8 行元素,关闭文件。
一个非常简单的过程,但是乘以几百个市场,结果是我的电脑无法处理。每天 2 到 100 次之间的任何时候,计算机都会卡住、掉线,我会丢失大约 20 秒的数据(大约 13,000 个样本!)
我目前正在查看 PyTables,看看是否可以加快我的进程。但我对计算机科学的了解还不够,无法真正了解速度问题的核心,希望得到一些智慧。
问题出在 .csv
文件上吗?我可以使用 PyTables 和 HDF5 来加快速度吗? 'right' 做这样的事情的方法是什么?
尝试将数据写入内存数据库或队列,或时间序列数据库,然后再持久化到磁盘。尝试 in mem databases or time series databases
中的内容
或者简单地尝试将时间序列数据写入 MSMQ 或另一个 MQ。
我现在读到 Pandas 是一种用于 Python 的内存数据库。没听说过。上面的列表中有很多!此外,为了回答您的一些问题,正确的做法是考虑对每个 "layer" 价格持久性的每个操作。首先,您的网络 IO 操作将比您的 CPU 更昂贵。其次,您的网络很容易出现带宽不堪重负的数据风暴。你需要一个大数据管道来处理突发事件。
因此,每个到达您的网络接口的价格消息都必须先通过 TCP 堆栈(大概),然后才能到达您的 CPU。 UDP is quicker than TCP 但如果您使用的是 QuickFIX,您将使用 TCP。
然后由于数据报是通过OSI layers it gets to your CPU which starts to cycle through the instructions, assuming the CPU isn't busy elsewhere. Here, basically if you have any IO (to disk or anywhere) your CPU is going to spin waiting for IO to complete. The OS may context switch to another process if your process priority is too low. Alternatively, your threading model may be causing too many context switches解包的,这种事情最好使用单线程,所以没有。
执行此操作的 "right" 方法是您希望从 NIC 获取数据,通过 CPU 并进入 MQ 或内存 space。然后,您可以稍后批量写入数据库...(每分钟或您决定的其他时间)
我正在使用带有 python 绑定的 QuickFix,以及用于数据管理的 pandas。
我已经处理这个问题一段时间了,在 SO 或 Google 上没有找到任何明确的 questions/answers 与之相关。它涉及低延迟环境中的代码效率和架构。
我正在记录财务数据。这是非常高的频率。在快速期间,(小型)消息每 15 毫秒左右到达一次。 QuickFix 将每条消息传递给我编写的消息破解程序,它执行以下操作:
- 用
re
解析消息
- 转换消息每个元素的数据类型(在本例中大约有 8 个)
- 用 8 个元素更新 pandas 数据框的值
- 在本地计算机上打开一个
.csv
文件,追加 8 行元素,关闭文件。
一个非常简单的过程,但是乘以几百个市场,结果是我的电脑无法处理。每天 2 到 100 次之间的任何时候,计算机都会卡住、掉线,我会丢失大约 20 秒的数据(大约 13,000 个样本!)
我目前正在查看 PyTables,看看是否可以加快我的进程。但我对计算机科学的了解还不够,无法真正了解速度问题的核心,希望得到一些智慧。
问题出在 .csv
文件上吗?我可以使用 PyTables 和 HDF5 来加快速度吗? 'right' 做这样的事情的方法是什么?
尝试将数据写入内存数据库或队列,或时间序列数据库,然后再持久化到磁盘。尝试 in mem databases or time series databases
中的内容或者简单地尝试将时间序列数据写入 MSMQ 或另一个 MQ。
我现在读到 Pandas 是一种用于 Python 的内存数据库。没听说过。上面的列表中有很多!此外,为了回答您的一些问题,正确的做法是考虑对每个 "layer" 价格持久性的每个操作。首先,您的网络 IO 操作将比您的 CPU 更昂贵。其次,您的网络很容易出现带宽不堪重负的数据风暴。你需要一个大数据管道来处理突发事件。
因此,每个到达您的网络接口的价格消息都必须先通过 TCP 堆栈(大概),然后才能到达您的 CPU。 UDP is quicker than TCP 但如果您使用的是 QuickFIX,您将使用 TCP。
然后由于数据报是通过OSI layers it gets to your CPU which starts to cycle through the instructions, assuming the CPU isn't busy elsewhere. Here, basically if you have any IO (to disk or anywhere) your CPU is going to spin waiting for IO to complete. The OS may context switch to another process if your process priority is too low. Alternatively, your threading model may be causing too many context switches解包的,这种事情最好使用单线程,所以没有。
执行此操作的 "right" 方法是您希望从 NIC 获取数据,通过 CPU 并进入 MQ 或内存 space。然后,您可以稍后批量写入数据库...(每分钟或您决定的其他时间)