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

3 投票
2 回答
3923 浏览
提问于 2025-04-16 09:35

我正在用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

如果你的数据在一个 dbf 文件里,你可以试试 我的 dbf 包。这个包的特点是,它只会把正在访问的记录保存在内存中,这样你就可以逐个查看记录,提取你需要的数据:

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]
4

如果数据太大,无法全部放进内存,你可以使用一种叫做内存映射文件的方法(这就像是一个存储在硬盘上的numpy数组 - 查看文档)。不过,根据你需要对数组进行的操作,使用HDF5也可能得到类似的效果。显然,这样会让很多操作变慢,但总比根本无法进行操作要好。

因为你遇到了内存限制,我觉得你不能使用genfromtxt。相反,你应该逐行读取文本文件,然后把数据写入到内存映射或HDF5对象的相应位置。

你提到的“回到原始dbf数据”是什么意思并不太清楚?显然,你可以把文件名存储在某个地方。HDF5对象有“属性”,专门用来存储这种元数据。

另外,我发现使用h5py访问HDF5文件比使用pytables要简单和干净得多,当然这主要还是个人喜好问题。

撰写回答