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

Python 试图通过使用h5py更改索引字段类型来缩小HDF5文件的大小,python,h5py,Python,H5py,我有一个非常大的CSV文件(~12Gb),看起来像这样: posX、posY、posZ、eventID、parentID、时钟时间 -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.9560546

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

posX、posY、posZ、eventID、parentID、时钟时间 -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格式,同时通过设置字段/索引类型降低总文件大小,例如:

将posX、posY和posZ另存为float32。将eventID、parentID和clockTime另存为int32或类似的代码

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

然而,我无法得到预期的结果。到目前为止,我所尝试的: 按照本指南使用熊猫自己的方法: 这会创建文件,但不知怎么的,我无法更改类型,并且文件仍然太大(~10.7Gb)。字段类型为float64和int64

在使用增量之前,我还尝试将CSV拆分为多个部分(使用split-nxmyfile.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文件,同时更改每个索引的变量类型


如果有不清楚的地方,请要求我澄清。我还是个初学者

您是否考虑过
numpy
模块? 它有一个方便的功能(
genfromtxt
)将带有标题的CSV数据读取到Numpy数组中。您可以定义数据类型。该阵列适合使用
h5py.create_dataset()
函数加载到HDF5中

请参阅下面的代码。我包括2份打印报表。第一个显示从CSV头创建的数据类型名称。第二个示例显示了如何通过字段(列)名称访问numpy数组中的数据


很抱歉迟了回复!我确实尝试使用一个3.7gb的大CSV文件来运行这段代码,但遗憾的是,由于某种原因(我的系统中有16gb)内存不足。在使用了~800mb的大CSV文件后,尽管在我运行脚本时占用了~8gb的RAM,但它还是按预期运行。我的示例使用了OP中的小数据片段。我没有对大数据集进行任何内存测试。根据您的结果,您必须将CSV数据拆分为单独的文件(带有标题)。然后,您可以在第一次读/写时
创建\u dataset()
,然后读取更多数据,调整数据集大小,并写入更多数据。参见这些SO帖子中的示例:和
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()