在Python中存储和重新加载大型多维数据集

在Python中存储和重新加载大型多维数据集,python,multidimensional-array,data-warehouse,pytables,Python,Multidimensional Array,Data Warehouse,Pytables,我将运行大量的模拟,生成大量的数据,这些数据需要在以后存储和访问。模拟程序的输出数据写入文本文件(每个模拟一个)。我计划编写一个Python程序,读取这些文本文件,然后以更方便以后分析的格式存储数据。经过一段时间的搜索,我认为我正遭受信息过载的困扰,所以我将这个问题提交给Stack Overflow,以寻求一些建议。详情如下: 我的数据基本上采用多维数组的形式,其中每个条目的外观如下所示: data[ stringArg1, stringArg2, stringArg3, stringArg4,

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

我的数据基本上采用多维数组的形式,其中每个条目的外观如下所示:

data[ stringArg1, stringArg2, stringArg3, stringArg4, intArg1 ] = [ floatResult01, floatResult02, ..., floatResult12 ]
每个参数的潜在值大致如下:

第1点50分

阿根廷2:20

第3页:6页

附件arg4:24

表1:10000

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

因此,根据这些数字,我的数组将有大约50*16*6*24*5000=576000000个结果列表

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

  • 关系数据库

  • 皮Tables

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

  • 在这三种方法中我都遇到了一个问题,我总是将(stringArg1、stringArg2、stringArg3、stringArg4、intArg1)的每个元组组合存储为表中的字段或Python字典中的键。从我(可能是天真的)观点来看,这似乎不必要。如果这些都是整数参数,那么它们将只构成数组中每个数据项的地址,而不需要将所有可能的地址组合存储在单独的字段中。例如,如果我有一个2x2数组=[[100200],[300400]],您可以通过请求地址数组[0][1]中的值来检索值。您不需要将所有可能的地址元组(0,0)(0,1)(1,0)(1,1)存储在其他地方。所以我希望能找到一个解决办法

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

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

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


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

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

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


    或者,如果第三个和第四个字符串值的每个值都如您所述始终存在,那么第六个表可能只包含3列(string1、string2、int1),您可以通过笛卡尔连接动态生成string3和string4的组合。

    为什么不使用一个大表来保留所有5亿个条目?如果在飞行压缩中使用(此处建议使用Blosc压缩程序),大部分重复条目都将被删除,因此存储开销将保持在最低限度。我建议尝试一下;有时简单的解决方案效果最好;-)

    我不完全确定您在这里要做什么,但看起来您正在尝试创建一个(潜在的)稀疏多维数组。因此,我不会详细讨论如何解决您的具体问题,但我所知道的最好的解决方案是Numpy。小罐

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

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

    希望您能在易于阅读的文档中找到一些东西:


    我不清楚您想在这里储存什么。是否不仅要存储当前数据集,还要存储关于不同字段中哪些值组合有效的约束?在您的数据模型明确之前,成功实施高效存储解决方案的机会是有限的。这一点很好。简单是好的,如果它工作。您有关于如何在PyTables表上使用Blosc的示例吗?我是PyTables的新手,在任何地方都找不到示例(无论是在Blosc网站还是PyTables上)。然而,我确实使用一个表和50个整型变量的值来测试我的方案。使用该方案,创建的.h5文件PyTables的大小为450MB!Cleary如果这是goi我需要压缩