如何加快从二进制文件到HDF5文件的转换?

时间:2017-05-23 06:02:26

标签: python numpy hdf5 h5py

我有.dat二进制文件,想要将其转换为.h5文件。所以我写了这段代码:

import os
import h5py
import numpy as np
import struct
import random
float_size=4

input_node=1534
output_node=256
input_file='./data/training_normalization_Target_ForWolfram.dat'
out_file=r'./data/training_normalization_Target_ForWolfram.h5'

input_and_output_node=input_node+output_node
with open(input_file,'rb') as f:
    f.seek(0,os.SEEK_END)
    file_len=f.tell()/(float_size*input_and_output_node)
    print 'the size of input_file is '+str(os.path.getsize(input_file)/(1024**3.))+' GB'

with h5py.File(out_file, "w") as f:
    Input =  f.create_dataset('Input', (file_len,input_node),dtype='float',chunks=True,compression='gzip')
    Output = f.create_dataset('Output',(file_len,output_node),dtype='float',chunks=True,compression='gzip')
    index=range(0,file_len)
    random.shuffle(index)
    with open(input_file,'rb') as fin:
        print 'it will iterate '+ str(file_len) +' times'
        for i in range(file_len):
            print i
            fin.seek(float_size*input_and_output_node*index[i],os.SEEK_SET)
            Input[i,:]  = np.array(struct.unpack('<'+str(input_node )+'f',fin.read(float_size*input_node)))
            Output[i,:] = np.array(struct.unpack('<'+str(output_node)+'f',fin.read(float_size*output_node)))

但它太慢了......(.dat文件的大小约为19.45 GB) 那么如何提高变换的速度呢?

enter image description here

如果不使用任何compression,它会稍快一些(大约10倍)。但是对于这个大文件来说,确实非常慢。

0 个答案:

没有答案