我想将csv文件转换为hdf5格式,用于caffe培训。因为csv文件是80G,它会报告内存错误。机器内存是128G。所以它可以改进我的代码?逐个处理?下面是我的代码,它报告了在np.array中运行时的内存错误
if '__main__' == __name__:
print 'Loading...'
day = sys.argv[1]
file = day+".xls"
data = pd.read_csv(file, header=None)
print data.iloc[0,1:5]
y = np.array(data.iloc[:,0], np.float32)
x = np.array(data.iloc[:,1:], np.float32)
patch = 100000
dirname = "hdf5_" + day
os.mkdir(dirname)
filename = dirname+"/hdf5.txt"
modelname = dirname+"/data"
file_w = open(filename, 'w')
for idx in range(int(math.ceil(y.shape[0]*1.0/patch))):
with h5py.File(modelname + str(idx) + '.h5', 'w') as f:
d_begin = idx*patch
d_end = min(y.shape[0], (idx+1)*patch)
f['data'] = x[d_begin:d_end,:]
f['label'] = y[d_begin:d_end]
file_w.write(modelname + str(idx) + '.h5\n')
file_w.close()
答案 0 :(得分:0)
最好的方法是读取n行,然后将这些行写入HDF5文件,每次扩展为n个元素。这样,所需的内存量不依赖于csv文件的大小。你也可以一次读一行,但效率会稍差。
以下是应用此过程读取气象站数据的代码: https://github.com/HDFGroup/datacontainer/blob/master/util/ghcn/convert_ghcn.py
答案 1 :(得分:0)
实际上,由于您单独处理大小为100000的块,因此无需将整个CSV加载到一个块中。 chunksize
中的read_csv
选项完全符合这种情况。
指定chunksize
时,read_csv
将成为迭代器,返回大小为DataFrames
的{{1}}。您可以迭代而不是每次切片数组。
减去设置不同变量的所有行,你的代码应该更像这样:
chunksize