HDFStore附加到数据集 - 适用于较小的子集,较大子集的中断

时间:2016-06-11 23:20:21

标签: python pandas hdf5

我正在将高维数据集(90 * 80000)加载到分块的pandas数据帧中。使用HDF5store我想将此数据集写入.hdf5。 我正在将数据集划分为矩阵 90 * 6 90 *剩余列

我正在使用食谱中概述的方法,并尝试了我发现分散在互联网上的不同解决方案 - 无济于事。我认为问题可能是,第二个分区的标题太大(考虑到64kb的限制)。但是,我认为我只将矩阵,而不是整个数据帧传递给.append命令。

这是我的代码:

i=0
reader = pd.read_csv(dataFile, delim_whitespace=True, chunksize=10, names=header, skiprows=1)
    for chunk in reader:
        # if i==0:
        #     print chunk.ix[:,6:].values
        #     store['df'] = chunk.ix[:,6:]
        #     print type(store['df'])
        #     print store['df'].shape
        # else:
        #     store.append('df', pd.DataFrame(chunk.ix[:,6:]))
        #     print store['df'].shape
        store.append('a',chunk.ix[:,6:])
        store.append('ID', chunk.ix[:,:6])         #the only command that works
        chunk.ix[:,6:].to_hdf(store, 'df', format="table", append=True)
        store.append('df', chunk.ix[:,6:].values)
        i+=1

这些是我单独尝试过的一系列选项,除了小数据小节外,它们都没有工作。注释版本将第一个块写入数据集,但随后抱怨它只能附加到表中。

一般错误消息:

  
    

回溯(最近一次调用最后一次):文件" D:/ OneDrive / Research / 2016研究项目/ python文件/ rawToHdf5TutChunked.py",109行,              store.append(' a',chunk.ix [:,6:])文件" C:\ Python27 \ lib \ site-packages \ pandas \ io \ pytables.py", 919行     附加         ** kwargs)文件" C:\ Python27 \ lib \ site-packages \ pandas \ io \ pytables.py",第1264行,in     _write_to_group         s.write(obj = value,append = append,complib = complib,** kwargs)File" C:\ Python27 \ lib \ site-packages \ pandas \ io \ pytables.py",第3801行,     在写         self.set_attrs()File" C:\ Python27 \ lib \ site-packages \ pandas \ io \ pytables.py",第3052行,in     set_attrs         self.attrs.non_index_axes = self.non_index_axes文件" C:\ Python27 \ lib \ site-packages \ tables \ attributeset.py",第461行,in     的 SETATTR         self._g__setattr(name,value)File" C:\ Python27 \ lib \ site-packages \ tables \ attributeset.py",403行in     _g__setattr         self._g_setattr(self._v_node,name,stvalue)File" tables \ hdf5extension.pyx",line 715,in     tables.hdf5extension.AttributeSet._g_setattr     (tables \ hdf5extension.c:7315)tables.exceptions.HDF5ExtError:HDF5     错误回溯

  
     

文件" J:\ dev \ src \ hdf5_1_8_cmake \ src \ H5A.c",第259行,在H5Acreate2中       无法在H5A_create中创建属性文件" J:\ dev \ src \ hdf5_1_8_cmake \ src \ H5Aint.c",第275行       无法在对象标题文件" J:\ dev \ src \ hdf5_1_8_cmake \ src \ H5Oattribute.c",第347行,in中创建属性   H5O_attr_create       无法在标题文件" J:\ dev \ src \ hdf5_1_8_cmake \ src \ H5Omessage.c",第224行中创建新属性   H5O_msg_append_real       无法创建新消息文件" J:\ dev \ src \ hdf5_1_8_cmake \ src \ H5Omessage.c",1945行,in   H5O_msg_alloc       无法为 H5O_alloc中的消息文件" J:\ dev \ src \ hdf5_1_8_cmake \ src \ H5Oalloc.c",第1142行分配空间       对象标题消息太大

     

HDF5错误返回跟踪结束

     

无法设置属性' non_index_axes'在节点中:/ a(组)''。闭幕   剩下的打开文件:t.hdf5 ...已完成

我不习惯使用大型数据集,因此可以欣赏任何输入。

1 个答案:

答案 0 :(得分:0)

这是一种现在很好用的解决方法。不过,我放弃了使用HDF5Store。 基本上我是使用h5py创建数据集并对其进行全面分配,然后修剪空行:

reader = pd.read_csv(datafile, delim_whitespace=True, chunksize=args.chunksize, names=header, skiprows=1)
max_rows_est = 880000   #estimate for maximum number of rows per file
i=0                     #counter for no of iterations through loop
n_rows=0                #counter of no of processed rows

for chunk in reader:
     big_chunk_shape = chunk.ix[:,6:].shape
     if i == 0:
         print 'creating dataset {0}'.format(j+1)
         dset2_data = f_hdf5.create_dataset('{0}'.format(j+1), (max_rows_est, big_chunk_shape[1]), maxshape=(None, big_chunk_shape[1]), dtype='<i4')
     dset2_data[i*big_chunk_shape[0]:(i+1)*big_chunk_shape[0], :] = chunk.ix[:,6:].values
     n_rows += big_chunk_shape[0]
     i+=1

dset2_data.resize((n_rows, big_chunk_shape[1]))