我正在尝试使用SciPy进行一些统计,但是我的输入数据集非常大(大约1.9 in ),并且是dbf格式的。这个文件足够大,当我试图用genfromtxt创建一个数组时,Numpy会返回一个错误消息。(我有3 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数据呢?在描述中?
谢谢你可能有的任何想法!
发布于 2011-01-08 06:30:43
如果数据太大,内存无法容纳,您可以使用内存映射文件(它类似于numpy数组,但存储在disk -see docs here上),不过您也可以使用HDF5获得类似的结果,这取决于您需要对该数组执行哪些操作。显然,这会使许多操作变慢,但这总比根本不能做要好。
因为您正在达到内存限制,所以我认为您不能使用genfromtxt。相反,您应该一次迭代一行文本文件,并将数据写入memmap/hdf5对象中的相关位置。
不清楚您所说的“引用回原始dbf数据”是什么意思?显然,您可以只存储它来自某处的文件名。HDF5对象具有旨在存储这种元数据的“属性”。
此外,我还发现使用h5py访问hdf5文件要比pytables简单得多,尽管这在很大程度上是一个偏好问题。
发布于 2011-07-14 02:54:11
如果数据在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]https://stackoverflow.com/questions/4629798
复制相似问题