尝试通过使用 h5py 更改索引字段类型来缩小 HDF5 文件的大小
Trying to size down HDF5 File by changing index field types using h5py
我有一个非常大的 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,0,0
-117.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 自己的方法:
这会创建文件,但我无法以某种方式更改类型,并且文件仍然太大(~10.7Gb)。字段类型为float64和int64。
在处理增量之前,我还尝试将 CSV 分成几部分(使用 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")
遗憾的是,这创建了文件和 table,但没有向其中写入任何数据。
预期
创建包含大型 CSV 文件数据的 HDF5 文件,同时更改每个索引的变量类型。
如果有什么不清楚的地方请找我澄清。我还是初学者!
您是否考虑过 numpy
模块?
它有一个方便的函数 (genfromtxt
),可以将 headers 的 CSV 数据读取到 Numpy 数组中。您定义数据类型。该数组适合使用 h5py.create_dataset()
函数加载到 HDF5。
见下面的代码。我包含了 2 个打印语句。第一个显示从 CSV headers 创建的 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()
我有一个非常大的 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,0,0 -117.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 自己的方法:
在处理增量之前,我还尝试将 CSV 分成几部分(使用 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")
遗憾的是,这创建了文件和 table,但没有向其中写入任何数据。
预期 创建包含大型 CSV 文件数据的 HDF5 文件,同时更改每个索引的变量类型。
如果有什么不清楚的地方请找我澄清。我还是初学者!
您是否考虑过 numpy
模块?
它有一个方便的函数 (genfromtxt
),可以将 headers 的 CSV 数据读取到 Numpy 数组中。您定义数据类型。该数组适合使用 h5py.create_dataset()
函数加载到 HDF5。
见下面的代码。我包含了 2 个打印语句。第一个显示从 CSV headers 创建的 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()