【问题标题】:Collecting, storing, and retrieving large amounts of numeric data收集、存储和检索大量数值数据
【发布时间】:2011-05-05 03:40:04
【问题描述】:

我即将开始实时收集大量数字数据(对于那些感兴趣的人,各种股票和期货的买入/卖出/最后或“磁带”)。稍后将检索数据以进行分析和模拟。这一点都不难,但我想有效地做到这一点,这会带来很多问题。我不需要最好的解决方案(无论如何,根据度量标准,可能有很多“最好的”)。我只是想要一个计算机科学家会认可的解决方案。 (还是不笑?)

(1) 针对磁盘空间、I/O 速度或内存进行优化?

对于仿真,整体速度很重要。我们希望数据的 I/O(真的,I)速度快于计算引擎,因此我们不受 I/O 限制。

(2) 存储文本或其他内容(二进制数字)?

(3) 给定 (1)-(2) 的一组选择,是否有任何出色的语言/库组合可以完成这项工作 - Java、Python、C++ 或其他?

我会将此代码归类为“编写后忘记”,因此效率比代码的清晰性/紧凑性更重要。我非常非常喜欢使用 Python 来编写模拟代码(因为模拟程序确实发生了很大变化并且需要明确)。好的 Pythonic 解决方案的加分项。

编辑:这是针对 Linux 系统 (Ubuntu)

谢谢

【问题讨论】:

  • 你考虑过 MATLAB 吗?它在数值处理方面非常高效,并且可以以良好的压缩格式保存文件。
  • 请注意,由于对正在实现的底层算法有更深入的了解,因此清晰度通常与效率齐头并进。

标签: java c++ python storage simulation


【解决方案1】:

如果您只是存储,请使用系统工具。不要自己写。如果您需要在数据存储之前对数据进行一些实时处理,那就完全不同了。

【讨论】:

    【解决方案2】:

    Fame 是时间序列存储的常用商业解决方案。

    如果您认真对待这一点,那么构建自己的将是一项艰巨的工作。 HDF 可能有用,他们声称它适用于刻度数据处理,并具有 C++ 访问权限。有 Python 支持here

    来自有同样问题的人的有用的现实生活经验here,包括 HDF5 参考。

    【讨论】:

    • 从外观上看,HDF 可能是完美的。我不是在这里尝试突破数据收集的限制,只是以合理有效的方式从我喜欢交易的少数合约中捕获报价流。
    • @Pete - 该博客上有一篇后续文章表明原型运行良好。您可能可以联系作者以获取更多信息。
    【解决方案3】:
    1. 优化磁盘空间和 IO 速度是一回事 - 如今,与 IO 相比,CPU 的速度非常快,以至于在存储数据之前压缩数据通常会更快(您实际上可能想要这样做)。我真的不认为内存发挥了重要作用(尽管您可能应该使用大小合理的缓冲区来确保执行顺序写入)。

    2. 二进制更紧凑(因此更快)。鉴于数据量,我怀疑人类可读性是否有任何价值。文本格式的唯一优点是,如果它被损坏或解析代码丢失,更容易找出和纠正。

    【讨论】:

      【解决方案4】:

      实际上,这与我所做的非常相似,即监控玩家在游戏中对世界所做的更改。我目前正在使用带有 python 的 sqlite 数据库。 在程序开始时,我将磁盘数据库加载到内存中,以便快速编写程序。每个更改都放入两个列表中。这些列表适用于内存数据库和磁盘数据库。每 x 左右更新一次,内存数据库就更新一次,计数器上推一个。这是重复的,当计数器等于 5 时,它被重置,磁盘更改的列表被刷新到磁盘数据库并清除列表。我发现如果我还将写入更多设置为 WOL(写入提前记录)。如果我每 100 次更新更新一次内存并且磁盘计数器设置为每 5 次内存更新更新一次,则此方法每秒可以进行 100-300 次更新。您可能应该选择二进制,有意义,除非您的数据源有错误,否则最合乎逻辑

      【讨论】:

      • 好东西,你能评论一下更新中的数据量(你每秒处理 100-300 个)吗?
      • 好吧,我放置的每个条目都有一个ID(int),更改前的状态(十六进制),更改后的状态(十六进制),玩家姓名(字符串)和unix格式的日期(整数)
      【解决方案5】:

      使用 D-Bus 格式发送信息可能对您有利。格式为标准、二进制,D-Bus 以多种语言实现,既可用于网络发送,也可用于同一台机器的进程间发送。

      【讨论】:

        【解决方案6】:

        在阅读storing integers efficiently given certain conditions 上的此帖子后,我突然想到,当我们将刻度数据存储为双精度或浮点数或其他任何内容时,我们浪费了很多位。 价格是量化的!而且相当严重。例如,昨天的 NQ 范围约为 2175-2191,或约 26 个点,量化为 0.25。所以这将刻度限制在约 100 个不同的价格。看看我要去哪里?每个价格只需要一个字节。股票按 0.01 量化,因此每日范围内的每一美元需要约 1 个字节。

        所以我概述的方法是: (1)将高价、低价、增量存储为一行表头 (2) 之后将分时数据存储为两个字节,最左边的两个位用于编码分时类型(00 = 最后,01 = 出价,11 = 卖价)

        我认为这是 CS 会赞成的!

        【讨论】:

          猜你喜欢
          • 2014-03-22
          • 2013-09-04
          • 1970-01-01
          • 2011-04-17
          • 2012-09-24
          • 1970-01-01
          • 1970-01-01
          • 2017-01-01
          • 1970-01-01
          相关资源
          最近更新 更多