对于我的一个项目,我必须将一个大型事件集合输入到数据库中以供以后处理,我正在尝试确定哪个DBMS最适合我的目的。
我有:
目前约有400,000,000个离散事件
将存储在数据库中的大约600 GB数据
这些事件有多种格式,但我估计个别属性的数量约为5,000。大多数事件仅包含每个约100个属性的值。属性值将被视为任意字符串,在某些情况下,还将被视为整数。
这些事件最终将合并为一个时间序列。虽然它们确实有一些内部结构,但没有引用其他事件,我认为这意味着我不需要对象DB或某些ORM系统。
我的要求:
开源许可证 - 我可能需要稍微调整一下。
通过扩展到多个服务器可扩展,但最初只使用一个系统。
快速查询 - 更新并不重要。
C / C ++,Java和Python的成熟驱动程序/绑定。优先考虑与他人合作的许可证 - 由于技术决定,我宁愿不做任何事情。我认为大多数DB驱动程序在这里没有问题,但无论如何都应该提到。
Linux的可用性。
如果它也适用于Windows,那将是不错的,但不是必需的
我的理想数据库允许我使用单个查询检索指定时间段内的所有事件。
到目前为止我找到/考虑的内容:
Postgresql在每个表中显然最多可包含6,000列。如果我对属性计数的估计没有关闭,可能会这样做。
MySQL似乎每张表限制为4,000列。我可以使用带有一点SQL-fu的多个表,但我宁愿不这样做。
MongoDB正是我目前所倾向的。它允许我保留事件的内部结构,同时仍然能够查询它们。它的API似乎也很简单。我不知道它在性能方面表现如何 - 至少在一台服务器上。
OpenTSDB及其度量标准收集框架听起来很有趣。我可以为每个属性使用单个时间序列(这可能有助于我的一些处理),将属性值作为标记并另外标记将它们与特定事件相关联的条目。从管理员和应用程序员的角度来看,它可能具有上述三个更陡峭的准备曲线。不知道它的表现。
直接使用HBase。这可能比OpenTSDB更符合我的要求,尽管 - 从我过去使用hadoop的经验来看 - 管理费用可能仍高于前三个选项。
可能有其他数据库可以做到这一点,所以请随时让我知道 - 我将不胜感激任何可能对此有帮助的建议或评论。
PS:作为数据库管理员,我的经验很少,所以我对任何误解都表示道歉。
答案 0 :(得分:6)
使用包含数千列的表格是疯狂的。特别是当你说的大多数都是零时。
首先应该考虑从中转换数据结构:
table_1
-------
event_id
attribute_1
attribute_2
[...]
attribute_5000
这样的事情:
table_1 event_values attributes
-------- ------------ ----------
event_id event_id attribute_id
attribute_id attribute_type
attribute_value
可以与任何RDMS一起使用(那么你的唯一约束就是总数据库大小和性能)
答案 1 :(得分:0)
答案可能已经很晚了,但这就是我所做的。
我使用HDF5作为我的时间序列库。它有许多有效和快速的压缩方式,可以混合和匹配。它可以与许多不同的编程语言一起使用。它可以在Windows和Linux上使用。
我使用boost :: date_time作为时间戳字段。这允许进行各种基于日期时间的计算。
在金融领域,我然后为每个条形,刻度,交易,报价创建特定的数据结构......
我创建了许多自定义迭代器,并使用标准模板库算法来有效地搜索特定值或基于时间的记录范围。然后可以将选择加载到内存中。