我将运行大量模拟,生成大量需要存储并稍后再次访问的数据。我的模拟程序的输出数据被写入文本文件(每个模拟一个)。我计划编写一个Python程序来读取这些文本文件,然后以更便于以后分析的格式存储数据。经过相当多的搜索,我认为我正在遭受信息过载,所以我将这个问题提交给Stack Overflow以获取一些建议。以下是详细信息:
我的数据基本上采用多维数组的形式,其中每个条目看起来都像这样:
data[ stringArg1, stringArg2, stringArg3, stringArg4, intArg1 ] = [ floatResult01, floatResult02, ..., floatResult12 ]
每个参数大致具有以下数量的潜在值:
stringArg1:50
stringArg2:20
stringArg3:6
stringArg4:24
intArg1:10,000
但请注意,数据集将是稀疏的。例如,对于stringArg1的给定值,将仅填充大约16个stringArg2值。此外,对于(stringArg1,stringArg2)的给定组合,将填充大约5000个intArg1值。第3和第4个字符串参数是总是完全填满。
因此,使用这些数字,我的数组将大约有50 * 16 * 6 * 24 * 5000 = 576,000,000个结果列表。
我正在寻找存储此数组的最佳方法,以便我可以将其保存并稍后重新打开,以添加更多数据,更新现有数据或查询现有数据进行分析。到目前为止,我已经研究了三种不同的方法:
关系数据库
PyTables
使用元组作为字典键的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似乎不支持让一个表的单元格包含其他表格。所以我似乎在那里遇到了死胡同。
我一直在阅读数据仓库和星型模式方法,但看起来你的事实表似乎需要包含每个可能的参数组合的元组。
好的,所以我几乎就是这样。任何和所有建议将非常感谢。在这一点上,我一直在寻找我的大脑疼痛。我觉得是时候问专家了。
答案 0 :(得分:2)
为什么不使用大表来保存所有5亿条目?如果您使用飞行中的压缩(此处推荐的Blosc压缩器),大多数重复的条目将被重复删除,因此存储的开销将保持在最低限度。我建议试一试;有时简单的解决方案效果最好; - )
答案 1 :(得分:0)
基本的6表方法是否有理由不适用?
即。表1-5是定义每个字段的有效值的单列表,然后最终表将是一个5列表,用于定义实际存在的条目。
或者,如果您描述的第3个和第4个字符串值的每个值总是存在,则第6个表可能只包含3个列(string1,string2,int1),并通过笛卡尔动态生成string3和string4的组合加入。
答案 2 :(得分:0)
我不完全确定你在这里尝试做什么,但看起来你试图创建一个(可能)稀疏的多维数组。因此,我不会详细解决您的具体问题,但我知道处理此问题的最佳方案是Numpy Numpy。 Numpy可以
用作通用数据的有效多维容器。可以定义任意数据类型。这使得NumPy可以无缝快速地与各种数据库集成。
我多次使用Numpy进行模拟数据处理,它提供了许多有用的工具,包括简单的文件存储/访问。
希望你会在其中找到一些非常容易阅读的文档: