首页 文章

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

提问于
浏览
3

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

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

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

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

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

  • 4

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

相关问题