“通过PyTables或PyHDF将”大文本文件读入hdf5?

时间:2011-01-07 20:09:56

标签: python hdf5 pytables

我正在尝试使用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数据呢?在描述中?

感谢您的任何想法!

2 个答案:

答案 0 :(得分:4)

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

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

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

此外,我发现使用h5py是一种比pytables更简单,更简洁的方式来访问hdf5文件,尽管这主要是一个偏好问题。

答案 1 :(得分:0)

如果数据在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]