我们准备收集大量实时数值数据(例如股票和期货的买入价/卖出价/最新价或“磁带”),稍后将检索这些数据进行分析和模拟。这并不难,但我们要高效地完成此操作,这就带来许多问题。我们无需最佳解决方案(无论如何,可能会有许多“最佳”解决方案,具体取决于衡量标准)。我们只想找到计算机科学家会认可的解决方案。(或不会嘲笑?)
主要问题如下:
- 优化磁盘空间、I/O 速度还是内存?
- 存储文本还是其他内容(二进制数字)?
- 在 (1)-(2) 中给定一系列选择,是否有任何出色的语言/库组合可以完成此任务——Java、Python、C++ 或其他语言?
我们将此代码归类为“写完即忘”,因此效率优先于代码的清晰度/紧凑性。我们非常希望坚持使用 Python 进行模拟代码(因为模拟确实会发生很多变化,需要清晰)。因此,对于好的 Pythonic 解决方案,加分。 编辑:这是针对 Linux 系统 (Ubuntu) 的。 谢谢。
- 解决方案
a. 优化磁盘空间和 IO 速度是一回事——如今,与 IO 相比,CPU 速度非常快,因此通常在存储数据之前对数据进行压缩会更快(您可能实际上想这样做)。我们真的看不到内存扮演重要角色(尽管您可能应该使用合理大小的缓冲区来确保您正在进行顺序写入)。
b. 二进制文件更紧凑(因此速度更快)。考虑到数据量,我们怀疑人类可读性是否有任何价值。文本格式的唯一优势在于,如果文本格式损坏或您丢失了解析代码,则更容易理解和更正。
c. Fame 是一种经常用于时间序列存储的商业解决方案。如果您对此认真,那么构建自己的解决方案将是一项艰巨的任务。HDF 可能会有用,他们声称它适合处理滴答数据,并且可以访问 C++。这里有 Python 支持。
d. 实际生活中的有用经验来自遇到相同问题的人,包括 HDF5 参考。
e. 实际上,这与我正在做的事情非常相似,即监控玩家对游戏世界所做的更改。我目前正在使用带有 python 的 sqlite 数据库。在程序开始时,我将磁盘数据库加载到内存中,以便快速编写过程。每个更改都会放入两个列表中。这些列表适用于内存数据库和磁盘数据库。每 x 次左右更新,内存数据库就会更新,并且计数器会加一。重复此过程,当计数器等于 5 时,它将重置,并将包含磁盘更改的列表刷新到磁盘数据库,并清除该列表。我发现如果我将更多写入也设置为 WOL(预写日志),则这种方法效果很好。如果每 100 次更新更新一次内存,并且将磁盘计数器设置为每 5 次内存更新更新一次,则此方法可以承受每秒大约 100-300 次更新。您应该选择二进制,除非您的数据源存在故障,否则是最合理的。
f. 使用 D-Bus 格式发送信息可能对您有利。该格式是标准的二进制格式,D-Bus 在多种语言中实现,并且可用于通过网络发送信息,也可以在同一台机器上进行进程间通信。