2017-04-24 51 views
0

我目前正试图使用​​h5py来存储一个大的numpy.ndarray。h5f.create_dataset导致MemoryError

print len(train_input_data_interweawed_normalized) 
    print train_input_data_interweawed_normalized[0].shape 
    raw_input("Something") 
    print "Storing Train input" 
    h5f = h5py.File(fbank+'train_input_'+str(dim)+'_'+str(total_frames_with_deltas)+'_window_height_'+str(window_height)+'.h5', 'w') 
    h5f.create_dataset('train_input', data=np.concatenate(train_input_data_interweawed_normalized,axis=1)) 
    ##Program chrash here 
    h5f.close() 

输出打印的:

4834302 
(45, 1, 8, 3) 

但不知何故程序chrashses与错误信息的MemoryError ..

是什么意思..没有足够的内存? 根据htop的ram使用情况在它的崩溃之前是11 gb/15 gb。

所以它不可能是这样吗?

那还有什么?

+0

测试'h5f'调用之外的'np.concatenate()'步骤。它必须在写入文件之前创建这个大阵列。当你在这里时,向我们展示这些印刷报表的结果。是的,内存错误通常意味着你正在尝试创建一个对你的内存来说太大的数组。记忆测量只是故事的一部分。我们需要一些关于该阵列应该有多大的想法。 – hpaulj

+0

是的..它似乎像'np.concatenate()'是造成这个问题..是否有可能连接并保存在步骤? –

+0

它看起来像'train_input_data_interweawed_normalized'是一个相当小的阵列(1080个元素)很长的列表。而'concatenate'试图制作一个(45,4834302,8,3)4d阵列,5G元素阵列。难怪它给出了一个内存错误。它可能有足够的空间容纳散布在周围的元素,但它不能将它们全部放在一个连续的内存块中。 – hpaulj

回答

0

连接过程至少需要将所有列表元素的大小作为连续内存块来创建。如果你只有16GB的RAM,内存分配可能会失败。

连接数据然后将其保存到HDF5文件在这里没有任何意义。你为什么把数据放在数组列表中?

以下示例显示如何将未连接或内存复制的列表内容写入到所需大小的HDF5数据集。

#get the dimensions 
dim_1=len(train_input_data_interweawed_normalized) 
dim_2=train_input_data_interweawed_normalized[0].shape 

h5f=h5py.File(fbank+'train_input_'+str(dim)+'_'+str(total_frames_with_deltas)+'_window_height_'+str(window_height)+'.h5','w') 
# create the dataset (change the datatype if your images have some other type) 
#You have to adapt the chunk size to your needs (How do you want to read the data?) 
dset_out = f_out.create_dataset('train_input', (dim_2[0],dim_1,dim_2[2],dim_2[3]), chunks=(dim_2[0], 100, dim_2[2], dim_2[3]),dtype='float32') 
for i in range(0,dim_1):  
    dset_out[:,i:i+1,:,:]=train_input_data_interweawed_normalized[i] 
f_out.close()