6

我将运行大量模拟,产生大量需要存储和稍后再次访问的数据。我的模拟程序的输出数据被写入文本文件(每个模拟一个)。我计划编写一个 Python 程序来读取这些文本文件,然后将数据以一种更便于以后分析的格式存储。经过相当多的搜索,我认为我正在遭受信息过载的困扰,所以我将这个问题提交给 Stack Overflow 寻求一些建议。以下是详细信息:

我的数据基本上将采用多维数组的形式,其中每个条目看起来像这样:

data[ stringArg1, stringArg2, stringArg3, stringArg4, intArg1 ] = [ floatResult01, floatResult02, ..., floatResult12 ]

每个参数大致具有以下数量的潜在值:

字符串Arg1:50

字符串Arg2:20

字符串Arg3:6

字符串Arg4:24

intArg1:10,000

但是请注意,数据集将是稀疏的。例如,对于 stringArg1 的给定值,将仅填充大约 16 个 stringArg2 值。此外,对于 (stringArg1, stringArg2) 的给定组合,将填充大约 5000 个 intArg1 值。第三和第四个字符串参数是总是完全充满。

所以,有了这些数字,我的数组将有大约 50*16*6*24*5000 = 576,000,000 个结果列表。

我正在寻找存储此数组的最佳方式,以便我可以保存它并稍后重新打开它以添加更多数据、更新现有数据或查询现有数据以进行分析。到目前为止,我已经研究了三种不同的方法:

  1. 关系数据库

  2. PyTables

  3. 使用元组作为字典键的 Python 字典(使用 pickle 保存和重新加载)

我在所有三种方法中都遇到了一个问题,我总是将 (stringArg1, stringArg2, stringArg3, stringArg4, intArg1) 的每个元组组合存储为表中的字段或 Python 字典中的键。从我(可能很天真)的角度来看,这似乎没有必要。如果这些都是整数参数,那么它们只会形成数组中每个数据条目的地址,并且不需要将所有潜在的地址组合存储在单独的字段中。例如,如果我有一个 2x2 数组 = [[100, 200] , [300, 400]],您将通过请求地址数组 [0][1] 处的值来检索值。您不需要将所有可能的地址元组 (0,0) (0,1) (1,0) (1,1) 存储在其他地方。所以我希望找到解决这个问题的方法。

我希望能够在 PyTables 中定义一个表格,其中第一个表格中的单元格包含其他表格。例如,顶级表将有两列。第一列中的条目将是 stringArg1 的可能值。第二列中的每个条目都是一个表格。然后这些子表将有两列,第一列是 stringArg2 的所有可能值,第二列是另一列子子表......

这种解决方案可以直接浏览和查询(特别是如果我可以使用 ViTables 浏览数据)。问题是 PyTables 似乎不支持让一个表格的单元格包含其他表格。所以我似乎在那里遇到了死胡同。

我一直在阅读数据仓库和星型模式方法,但您的事实表似乎仍然需要包含每个可能的参数组合的元组。

好的,这就是我所在的位置。任何和所有的建议将不胜感激。在这一点上,我一直在四处寻找,以至于我的大脑受伤了。我想是时候问问专家了。

4

3 回答 3

2

为什么不使用一张大表来保存所有 5 亿条条目?如果您使用动态压缩(此处推荐使用 Blosc 压缩器),大部分重复条目将被重复数据删除,因此存储开销保持在最低限度。我建议尝试一下;有时简单的解决方案效果最好;-)

于 2011-02-23T17:40:40.863 回答
0

我不完全确定您要在这里做什么,但看起来您正在尝试创建一个(可能)稀疏的多维数组。所以我不会详细介绍解决您的具体问题,但我知道处理这个问题的最好的包是 Numpy Numpy。麻木可以

用作通用数据的高效多维容器。可以定义任意数据类型。这使 NumPy 可以无缝且快速地与各种数据库集成。

我已经多次使用 Numpy 进行模拟数据处理,它提供了许多有用的工具,包括简单的文件存储/访问。

希望您会在它非常容易阅读的文档中找到一些东西:

带有示例的 Numpy 文档

于 2011-07-21T19:33:09.677 回答
0

基本的 6 表方法不适用有什么原因吗?

即表 1-5 将是定义每个字段的有效值的单列表,然后最终表将是定义实际存在的条目的 5 列表。

或者,如果您描述的第 3 个和第 4 个字符串值的每个值始终存在,则第 6 个表可能仅包含 3 列(string1、string2、int1),并且您通过笛卡尔连接动态生成 string3 和 string4 的组合。

于 2011-02-21T03:37:32.473 回答