我正在尝试使用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数据呢?在描述中?
感谢您的任何想法!
答案 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]