收集,存储和检索大量数字数据

时间:2010-11-04 15:51:53

标签: java c++ python storage simulation

我即将开始实时收集大量数字数据(对于那些感兴趣的人,出价/询问/最后或各种股票和期货的'磁带')。稍后将检索数据以进行分析和模拟。这根本不难,但我想有效地做到这一点,并提出了很多问题。我不需要最好的解决方案(根据指标,可能还有很多'bests',无论如何)。我想要一个计算机科学家会赞同的解决方案。 (或者不笑?)

(1)优化磁盘空间,I / O速度或内存?

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

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

(3)鉴于(1) - (2)中的一组选择,是否有任何出色的语言/库组合来完成这项工作 - Java,Python,C ++或其他什么?

我会将此代码归类为“写入和遗忘”,因此效率高于代码的清晰度/紧凑性。我非常非常希望坚持使用Python作为模拟代码(因为sims确实发生了很大变化,需要明确)。好的Pythonic解决方案的奖励积分。

编辑:这适用于Linux系统(Ubuntu)

由于

6 个答案:

答案 0 :(得分:3)

  1. 优化磁盘空间和IO速度是一回事 - 目前,CPU与IO相比如此之快,以至于在存储数据之前压缩数据通常总体上更快(实际上您可能希望这样做)。我并没有真正看到内存发挥重要作用(尽管你应该使用一个合理大小的缓冲区来确保你进行连续写入)。

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

答案 1 :(得分:1)

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

如果你认真对待这个问题,建立自己的工作将是一件大事。 HDF可能有用,他们声称它适用于tick数据处理,并且具有C ++访问权限。有Python支持here

来自具有相同问题here的人的有用真实体验,包括HDF5参考。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

使用D-Bus格式发送信息可能对您有利。格式为标准,二进制,D-Bus以多种语言实现,可用于通过网络发送和在同一台机器上进行处理。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我在storing integers efficiently given certain conditions阅读这个帖子后发现,当我们将滴答数据存储为双精度或浮点数等等时,我们浪费了很多比特。 价格已经过量化!而且相当严重。例如,昨天的NQ范围是从大约2175-2191,或大约26点,量化为0.25。因此,这限制了约100个不同的价格。看看我要去哪里?每个价格只需要一个字节。股票量化为0.01,因此在每日范围内每个美元需要~1个字节。

所以我概述的方法是: (1)存储高价格,低价格,并增加为一个行标题 (2)之后将tick数据存储为两个字节,最左边的两个位用于编码tick类型(00 = last,01 = bid,11 = ask)

我认为这是CS会赞​​同的!