【问题标题】:How to store wide tables in pytables / hdf5如何在 pytables / hdf5 中存储宽表
【发布时间】:2013-12-01 11:17:16
【问题描述】:

我有来自 csv 的数据,它有几千列和一万(左右)行。在每一列中,数据的类型相同,但不同的列具有不同类型的数据*。以前我一直在从 numpy 中提取数据并存储在磁盘上,但是速度很慢,尤其是因为通常我想加载列的一部分而不是全部。

我想使用 pytables 将数据放入 hdf5,我的第一种方法是将数据放入单个表中,每个 csv 列一个 hdf5 列。不幸的是,这不起作用,我认为是因为 512(软)列限制。

存储这些数据的明智方法是什么?

* 我的意思是,文本转换后的数据类型。

【问题讨论】:

    标签: python numpy hdf5 pytables


    【解决方案1】:

    也许您可以增加列数而不会降低性能。见:http://www.pytables.org/docs/manual-2.2.1/apc.html

    C.1.1。推荐最大值

    MAX_COLUMNS

    Maximum number of columns in Table objects before a PerformanceWarning is issued. This limit is somewhat arbitrary and can be increased.
    

    如果你想走这条路,只需在pytables目录中找到parameters.py文件并更改MAX_COLUMNS值即可。

    【讨论】:

    • 是的,我确实考虑过这一点,但认为如果我必须从一开始就更改这种配置,我可能做错了。
    • 如果您的数据是稀疏的(意味着许多行只有一小部分列值存在),您可以尝试重构您的表。或者,我知道 numpy 可以选择通过 x, y = np.loadtxt(file, delimiter=',', usecols=(0, 2)) 仅加载某些列。因此,一旦您将数据保存在磁盘上,您就可以加载各种列子集。我不确定该功能是否针对这种情况进行了优化。
    【解决方案2】:

    事实上,这可能无法以幼稚的方式进行。 HDF5 为每个数据集的元数据分配 64 kb 的空间。该元数据包括列的类型。因此,虽然列数是一个软限制,但在 2-3 千范围内的某个地方,您通常会用完存储元数据的空间(取决于列名的长度等)。

    此外,numpy 不是将列数限制为 32 吗?你现在如何用 numpy 表示数据?您可以进入 numpy 数组的任何内容都应对应于 pytables Array 类。

    【讨论】:

    • 当前存储为 numpy 数组的常规字典。
    • numpy 中的 32 列限制?没有这个限制。 numpy 永远不会在这样的限制下起飞。
    • @PhilCooper OP 可能意味着“维度”而不是列。 numpy 的维度限制为 32。 github.com/numpy/numpy/issues/5744
    【解决方案3】:

    您应该能够使用 pandas 数据框 它可以保存到磁盘而不转换为 csv

    【讨论】:

      【解决方案4】:

      恕我直言,这取决于您之后要对数据做什么以及一次需要多少数据。前段时间我不得不构建一个统计验证程序,我们有两种方法:

      1. 在单独的表中拆分列(例如,使用 FK)。加载它们的开销并不太高
      2. 转置表,产生类似于键值存储的东西,其中键是(列,行)的元组

      我们都使用了 postgres。

      【讨论】:

        【解决方案5】:

        没有 pytables,但使用 h5py 代替,这可以工作:

        data = np.recfromcsv(args[0], delimiter=',',
                             case_sensitive=True, deletechars='', replace_space=' ')
        with h5py.File(args[1], 'w') as h5file:
            h5file.create_dataset('table', data=data)
        

        第一行是从this answer借来的;不确定这是否适合你。 HDF 5 表看起来不错(通过 hdfview 快速查看);当然,我不知道你是否可以将它与 pytables 和 pandas 一起使用。

        【讨论】:

          猜你喜欢
          • 2012-06-23
          • 2016-11-22
          • 2018-04-05
          • 2015-10-21
          • 1970-01-01
          • 2013-01-21
          • 2021-12-04
          • 1970-01-01
          • 2013-12-03
          相关资源
          最近更新 更多