我正在使用带有python绑定的QuickFix以及用于数据管理的pandas。
我一直在处理这个问题,并且在SO或Google上没有找到任何与之相关的明确问题/答案。它涉及低延迟环境中的代码效率和体系结构。
我正在记录财务数据。频率极高。在快速期间,(小型)消息每15毫秒左右到达一次。 QuickFix将每条消息传递给我写的消息破解程序,它执行以下操作:
re
.csv
文件,附加8行元素,关闭文件。一个非常简单的过程,但将其乘以数百个市场,发生的事情是我的电脑无法处理。每天2到100次之间的任何地方,计算机窒息,脱机,我丢失大约20秒的数据(约13,000个样本!)
我现在正在看PyTables,看看我是否可以加快我的进程。但我对计算机科学知之甚少,无法真正了解速度问题的核心,并且会欣赏一些智慧。
问题是.csv
文件吗?我可以使用PyTables和HDF5加快速度吗?什么是正确的'做这样的事情的方式?
答案 0 :(得分:1)
尝试将数据写入内存数据库或队列或时间序列数据库,然后再保存到磁盘。尝试in mem databases或time series databases
中的内容或者只是尝试将时间序列数据写入MSMQ或其他MQ。
我现在读到Pandas是一种用于Python的内存数据库。没听说过。上面的列表中有很多内容!此外,为了回答您的一些问题,正确的方法是考虑每个"层上的每个操作。价格持久性。首先,您的网络IO操作将比您的CPU更昂贵。其次,您的网络将容易受到带宽不堪重负的数据风暴。你需要一个大数据管道来进行爆发。
因此,每条价格消息到达您的网络接口,必须在它到达您的CPU之前通过TCP堆栈(可能)。 UDP is quicker than TCP但如果您使用的是QuickFIX,那么您将使用TCP。
然后,当数据报通过OSI layers解包时,它会到达你的CPU,它开始循环执行指令,假设CPU不在其他地方忙。在这里,基本上如果你有任何IO(到磁盘或任何地方)你的CPU将旋转等待IO完成。如果您的流程优先级太低,操作系统可能context switch到另一个进程。或者,你的线程模型可能导致context switches太多,使用单个线程来做这类事情会更好,所以没有。
"对"这样做的方法是,您希望从NIC获取数据,通过CPU并进入MQ或内存空间。然后,您可以稍后批量写入数据库...(每分钟或您决定的事情)