我有.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)
那么如何提高变换的速度呢?
如果不使用任何compression
,它会稍快一些(大约10倍)。但是对于这个大文件来说,确实非常慢。