3

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

IE:

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 数据呢?在说明中?

感谢您的任何想法!

4

2 回答 2

4

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

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

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

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

于 2011-01-07T22:30:43.137 回答
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]
于 2011-07-13T18:54:10.937 回答