尝试通过使用h5py更改索引字段类型来缩小HDF5文件的大小

问题描述 投票:1回答:1

我有一个非常大的CSV文件(~12Gb),看起来像这样:

posX,posY,posZ,eventID,parentID,clockTime -117.9853515625,60.2998046875,0.29499998688697815,0,0,0 -117.9853515625,60.32909393310547,0.29499998688697815,0,0,0 -117.9560546875,60.2998046875,0.29499998688697815,0,0,0 -117.9560546875, 60.32909393310547,0.29499998688697815,0,011-127.92676544189453,60.2998046875,0.29499998688697815,0,0,0 -117.92676544189453,60.32909393310547,0.29499998688697815,0,0,0 -118.04051208496094,60.34012985229492,4.474999904632568,0,0,0 -118.04051208496094,60.36941909790039, 4.474999904632568,0,0,0 -118.04051208496094,60.39870834350586,4.474999904632568,0,0,0

我想使用库h5py将此CSV文件转换为HDF5格式,同时通过设置字段/索引类型i.G来降低总文件大小。他说:

将posX,posY和posZ保存为float32。将eventID,parentID和clockTime保存为int32或沿这些行的某些内容。

注意:当我读入数据时,我需要以某种形式对数据进行分块以避免内存错误。

但是我无法得到希望的结果。到目前为止我尝试过:使用Pandas自己的方法遵循本指南:How to write a large csv file to hdf5 in python?这会创建文件,但我无法改变类型,文件仍然太大(~10.7Gb)。字段类型是float64和int64。

在尝试使用增量之前,我还尝试将CS​​V拆分为多个部分(使用split -n x myfile.csv)。我在每个文件的开头和结尾遇到了一些数据错误,我可以通过使用sed删除所述行来修复。然后我尝试了以下代码:

import pandas as pd
import h5py

PATH_csv = "/home/MYNAME/Documents/Workfolder/xaa" #xaa is my csv increment
DATA_csv = pd.read_csv(PATH_csv)

with h5py.File("pct_data-hdf5.h5", "a") as DATA_hdf:
    dset = DATA_hdf.create_dataset("posX", data=DATA_csv["posX"], dtype="float32")

遗憾的是,这创建了文件和表,但没有写入任何数据。

期望创建包含大型CSV文件数据的HDF5文件,同时还更改每个索引的变量类型。

如果有什么不清楚请请我澄清。我还是初学者!

python h5py
1个回答
1
投票

你考虑过numpy模块吗?它有一个方便的功能(genfromtxt)来读取带有标题的CSV数据到Numpy数组。您定义dtype。该阵列适用于使用h5py.create_dataset()功能加载到HDF5中。

见下面的代码。我收录了2份印刷文件。第一个显示从CSV标头创建的dtype名称。第二部分显示了如何通过字段(列)名称访问numpy数组中的数据。

import h5py
import numpy as np

PATH_csv = 'SO_55576601.csv'
csv_dtype= ('f8', 'f8', 'f8', 'i4', 'i4', 'i4' )

csv_data = np.genfromtxt(PATH_csv, dtype=csv_dtype, delimiter=',', names=True)

print (csv_data.dtype.names)
print (csv_data['posX'])

with h5py.File('SO_55576601.h5', 'w') as h5f:
    dset = h5f.create_dataset('CSV_data', data=csv_data)

h5f.close()   
© www.soinside.com 2019 - 2024. All rights reserved.