【问题标题】:"Reading in" large text file into hdf5 via PyTables or PyHDF?通过 PyTables 或 PyHDF 将大文本文件“读入”到 hdf5?
【发布时间】:2011-06-05 12:19:38
【问题描述】:

我正在尝试使用 SciPy 进行一些统计,但我的输入数据集非常大(~1.9GB)并且采用 dbf 格式。 该文件足够大,以至于当我尝试使用 genfromtxt 创建数组时,Numpy 会返回错误消息。 (我有 3GB 内存,但运行的是 win32)。

即:

Traceback (most recent call last):

  File "<pyshell#5>", line 1, in <module>
    ind_sum = numpy.genfromtxt(r"W:\RACER_Analyses\Terrestrial_Heterogeneity\IND_SUM.dbf", dtype = (int, int, int, float, float, int), names = True, usecols = (5))

File "C:\Python26\ArcGIS10.0\lib\site-packages\numpy\lib\npyio.py", line 1335, in genfromtxt
    for (i, line) in enumerate(itertools.chain([first_line, ], fhd)):

MemoryError

从其他帖子中,我看到 PyTables 提供的分块数组可能很有用,但我的问题是首先读取这些数据。或者换句话说,PyTables 或 PyHDF 可以轻松创建所需的 HDF5 输出,但我应该如何首先将数据放入数组中?

例如:

import numpy, scipy, tables

h5file = tables.openFile(r"W:\RACER_Analyses\Terrestrial_Heterogeneity\HET_IND_SUM2.h5", mode = "w", title = "Diversity Index Results")

group = h5.createGroup("/", "IND_SUM", "Aggregated Index Values"`)

然后我可以创建一个表或数组,但是我如何引用原始 dbf 数据呢?在描述中?

感谢您的任何想法!

【问题讨论】:

    标签: python hdf5 pytables


    【解决方案1】:

    如果数据在 dbf 文件中,您可以尝试my dbf package -- 它只将正在访问的记录保存在内存中,因此您应该能够循环通过记录提取您需要的数据:

    import dbf
    
    table = dbf.Table(r"W:\RACER_Analyses\Terrestrial_Heterogeneity\IND_SUM.dbf")
    
    sums = [0, 0, 0, 0.0, 0.0, 0]
    
    for record in table:
        for index in range(5):
             sums[index] += record[index]
    

    【讨论】:

      【解决方案2】:

      如果数据太大而无法放入内存,您可以使用内存映射文件(它就像一个 numpy 数组,但存储在磁盘上 - see docs here),尽管您可以使用 HDF5 获得类似的结果取决于您需要对阵列执行的操作。显然,这会使许多操作变慢,但这总比不能做要好。

      因为你达到了内存限制,我认为你不能使用 genfromtxt。相反,您应该一次遍历您的文本文件一行,并将数据写入 memmap/hdf5 对象中的相关位置。

      不清楚您所说的“引用原始 dbf 数据”是什么意思?显然,您可以只存储它来自某个地方的文件名。 HDF5 对象具有旨在存储此类元数据的“属性”。

      另外,我发现使用h5py 是访问 hdf5 文件的一种比 pytables 更简单、更干净的方法,尽管这在很大程度上是一个偏好问题。

      【讨论】:

      • 如果他的输入文件是 1.9GB,他可能无法在 32 位操作系统上对其进行 mmap,但仍有剩余的地址空间供他的 python 代码进行转换。
      • 非常感谢。我将尝试您建议的内存映射路线。感谢您抽出宝贵时间分享您的想法。我会让你知道我是否启动并运行它,尽管我仍然担心我仍然受到 32 位操作系统的限制。我想我们会看看情况如何。再次感谢。
      猜你喜欢
      • 2011-05-20
      • 2011-12-21
      • 2021-09-25
      • 2015-10-10
      • 2016-11-12
      • 2018-03-25
      • 1970-01-01
      • 2020-04-03
      • 2015-07-05
      相关资源
      最近更新 更多