代码之家  ›  专栏  ›  技术社区  ›  jame

如果要执行行级数学操作,是否将数据系列存储在文件或数据库中?

  •  0
  • jame  · 技术社区  · 16 年前

    我正在开发一个应用程序来处理金融系列数据集(以csv或开放文档的形式输入),一个数据集可以是10'x 1000,最高可达两倍精度的数字(简化,但这才是关键)。

    我计划对这些数据(如和、差、平均值等)进行操作,并根据输入的计算生成另一列。这将在一个集合上的列(行级操作)之间进行,也将在行级上的多个集合(可能是所有集合)上的列之间进行。我计划用python编写它,它最终需要一个面向内部网的界面来显示结果/图形等。目前,基于一些输入参数的csv输出就足够了。

    存储数据和操作的最佳方法是什么?到目前为止,我认为我的选择是:(1)将csv文件写入磁盘并通过它们进行搜索来进行数学运算;(2)我可以将它们放入数据库,并依靠数据库来处理数学运算。我主要关心的是速度/性能,随着数据集数量的增长,数据集之间的行级数学将需要完成。

    -有没有人经历过走这条路,我应该知道哪些陷阱/陷阱?
    -为什么要选择一个而不是另一个呢?
    -在我开始设计之前,是否有任何可能影响设计的速度/性能缺陷/提升?
    -有没有项目或框架可以帮助完成这类任务?

    -编辑- 更多信息: 所有行都将按顺序读取,但我可能需要重新采样/插值以匹配不同的输入长度以及每行的时间戳。因为每个数据集总是有不同的长度,而这个长度是不固定的,所以我将在某个地方有一些临时表/内存来存放插入/重新取样的版本。我不确定是否更合理地尝试存储这个(并尝试向上采样/插入到一个共同的更高的长度),或只是在每次需要时重新生成它。

    4 回复  |  直到 13 年前
        1
  •  2
  •   S.Lott    16 年前

    我计划对该数据(如和、差、平均值等)进行操作,并根据输入的计算生成另一列。

    这是数据仓库星型模式设计的标准用例。购买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缓慢灵活。平锉速度快(有时)不灵活。巨蟒在比赛场地上放平。

    “在我开始设计之前,是否有任何可能影响设计的速度/性能缺陷/提升?”

    星型模式:由维度表包围的中心事实表。没有什么能比得上它。

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

    不是真的。

        2
  •  1
  •   Zog    16 年前

    对于速度优化,除了更改底层存储机制之外,我建议使用其他两种方法进行调查:

    1)使用中间数据结构。

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

    而求和和和和平均值只需要运行时 O(n) 更复杂的计算可以很容易地将其推到O(n^2)中,而无需应用此策略。O(n^2)将是一个性能冲击,它可能比从csv或数据库中读取的速度影响大得多。例如,如果您的数据行引用其他数据行,并且需要基于这些引用聚合数据。

    因此,如果您发现自己进行的计算比求和或平均值更复杂,那么您可能会探索可以在o(n)中创建的数据结构,并将计算操作保持在o(n)或更好。正如马丁所指出的,听起来你的整个数据集都可以轻松地保存在内存中,所以这可能会带来一些巨大的胜利。您将创建哪种数据结构取决于您正在进行的计算的性质。

    2)预缓存。

    根据数据的使用方式,您可以提前存储计算值。一旦生成/加载数据,就执行求和、平均值等操作,并将这些聚合与原始数据一起存储,或者在程序运行时将它们保存在内存中。如果此策略适用于您的项目(即,如果用户没有即时提出不可预见的计算请求),那么无论数据来自文本还是数据库,读取数据都不应该是令人望而生畏的长时间运行。

        3
  •  0
  •   Martin v. Löwis    16 年前

    如果所有数据都能同时装入内存,那么最重要的是什么?从您给出的大小来看,这似乎很容易(最坏是几兆字节)。

    如果是这样,我将不鼓励使用关系数据库,而是直接在Python中执行所有操作。根据您需要的其他处理,我可能更愿意使用二进制pickles,而不是csv。

        4
  •  0
  •   Martin Beckett    16 年前

    您可能需要按顺序排列所有行,还是只需要特定的已知行?
    如果您需要读取所有数据,那么在数据库中使用它没有多大的好处。

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