如果我想进行行级数学运算,请将数据系列存储在文件或数据库中?

时间:2009-08-06 21:58:14

标签: python database database-design file-io

我正在开发一个应用处理金融系列数据集的应用程序(输入为csv或打开文档),一组可以说10倍x 1000高达双精度数字(简化,但重要的是这些)。

我计划对该数据进行操作(例如,总和,差异,平均值等),包括基于输入的计算生成另一列。这将在一组上的列(行级操作)之间以及行级上的许多(可能是所有)集上的列之间。我打算用Python编写它,最终需要一个面向Intranet的界面来显示结果/图形等等,基于一些输入参数的csv输出就足够了。

存储数据和操作的最佳方法是什么?到目前为止,我认为我的选择是(1)将csv文件写入磁盘并通过它们进行拖网来进行数学运算,或者(2)我可以将它们放入数据库并依靠数据库来处理数学。我主要担心的是速度/性能,因为数据集的数量会增加,因为需要进行数据集间行级数学计算。

- 任何人都有过沿着这条路走下去的经历,我应该注意哪些陷阱/陷阱?
- 为什么选择一个人而不是另一个人的原因是什么?
- 在开始之前我是否需要注意任何可能影响设计的潜在速度/性能缺陷/提升?
- 那里有没有任何项目或框架来帮助完成这类任务?

CNC中 更多信息: 这些行将按顺序全部读取,但是我可能需要进行一些重采样/插值以匹配不同的输入长度以及每行的不同时间戳。由于每个数据集总是具有不固定的不同长度,因此我将在某处使用一些临时表/内存来保存插值/重采样版本。我不确定尝试存储它是否更有意义(并尝试上采样/插入到更常见的更高长度)或者只是在每次需要时重新生成它。

4 个答案:

答案 0 :(得分:2)

“我计划对该数据进行操作(例如总和,差异,平均值等),包括根据输入的计算生成另一列。”

这是数据仓库星型模式设计的标准用例。购买Kimball的数据仓库工具包。在做其他任何事情之前,请阅读(并理解)星型模式。

“存储数据和操作的最佳方式是什么?

星图。

您可以将其实现为平面文件(CSV很好)或RDBMS。如果使用平面文件,则编写简单的循环来进行数学运算。如果使用RDBMS,则编写简单的SQL 简单循环。

“随着数据集数量的增长,我主要担心的是速度/性能”

没有什么比平面文件快。期。 RDBMS速度较慢。

RDBMS价值主张源于SQL是一种指定SELECT SUM(), COUNT() FROM fact JOIN dimension WHERE filter GROUP BY dimension attribute的相对简单的方法。 Python并不像SQL那样简洁,但它同样快速且灵活。 Python与SQL竞争。

“我应该注意的陷阱/陷阱?”

数据库设计。如果你没有得到星型模式以及如何将事实与维度分开,那么所有方法都将注定失败。一旦您将事实与维度分开,所有方法都大致相等。

“为什么选择一个人而不是另一个人的原因是什么?”

RDBMS缓慢而灵活。平面文件快速且(有时)不太灵活。 Python可以平衡竞争环境。

“在我开始之前,我是否需要注意任何潜在的速度/性能缺陷/提升,这可能会影响设计?”

Star Schema:维度表包围的中心事实表。什么都没有。

“是否有任何项目或框架可以帮助完成此类任务?”

不是。

答案 1 :(得分:1)

对于速度优化,我建议除了改变底层存储机制之外还有其他两种调查途径:

1)使用中间数据结构。

如果最大化速度比最小化内存使用更重要,那么使用不同的数据结构作为计算的基础可能会获得良好的结果,而不是专注于底层存储机制。这是一种策略,实际上,无论数据是存储在数据库还是文本(在我的例子中是XML),我已经大大减少了项目的运行时间。

虽然总和和平均值仅需要O(n)的运行时间,但更复杂的计算可以轻松地将其推入O(n ^ 2)而不应用此策略。 O(n ^ 2)将是一个性能命中,可能比你从CSV或数据库中读取更多的速度影响。例如,如果您的数据行引用其他数据行,则需要根据这些引用聚合数据。

因此,如果您发现自己的计算比求和或平均值更复杂,那么您可以探索可以在O(n)中创建的数据结构,并将计算操作保持在O(n)或更好。正如Martin指出的那样,听起来您的整个数据集可以很好地保存在内存中,因此这可能会产生一些巨大的成功。您创建的数据结构类型取决于您正在进行的计算的性质。

2)预缓存。

根据数据的使用方式,您可以提前存储计算值。生成/加载数据后,执行总和,平均值等,并将这些聚合与原始数据一起存储,或者只要程序运行,就将它们保存在内存中。如果此策略适用于您的项目(即,如果用户没有即时提出无法预料的计算请求),则无论数据来自文本还是数据库,读取数据都不应过长。 / p>

答案 2 :(得分:0)

您是否可能需要按顺序排列所有行,或者只需要特定的已知行? 如果您需要阅读所有数据,那么将其存储在数据库中并没有多大好处。

编辑:如果代码适合内存,则可以使用简单的CSV。如果您可以使用纯文本数据格式,那么它们总是比不透明文本格式更容易处理。

答案 3 :(得分:0)

如果所有数据同时适合内存,最重要的是什么。从您给出的大小来看,这似乎很容易(最差几兆字节)。

如果是这样,我会阻止使用关系数据库,并直接在Python中执行所有操作。根据您需要的其他处理,我宁愿使用二进制泡菜而不是CSV。