我有来自csv的数据,它有几千列和一万(左右)行 . 在每列中,数据具有相同的类型,但不同的列具有不同类型的数据* . 以前我一直在从numpy和磁盘上存储数据,但它很慢,特别是因为通常我想加载一些列的子集而不是所有列 .
我想使用pytables将数据放入hdf5,我的第一种方法是将数据放在一个表中,每个csv列有一个hdf5列 . 不幸的是,这不起作用,我假设因为512(软)列限制 .
存储此数据的合理方法是什么?
*我的意思是,从文本转换后的数据类型 .
事实上,这可能不会以天真的方式进行 . HDF5为每个数据集的元数据分配64 kb的空间 . 该元数据包括列的类型 . 因此,虽然列数是一个软限制,但在2-3万个范围内,您通常会用尽空间来存储元数据(取决于列名的长度等) .
此外,numpy不会将列数限制为32?你现在如何用numpy代表数据?你可以进入一个numpy数组的任何东西都应该对应一个pytables数组类 .
没有pytables,但是使用h5py,这可能有效:
data = np.recfromcsv(args[0], delimiter=',', case_sensitive=True, deletechars='', replace_space=' ') with h5py.File(args[1], 'w') as h5file: h5file.create_dataset('table', data=data)
我从this answer借了第一行;不确定这是否适合你 . HDF 5表看起来很好(从hdfview快速查看);当然,我不知道你是否可以将它与pytables和熊猫一起使用 .
也许您可以在不降低性能的情况下增加列数 . 见:http://www.pytables.org/docs/manual-2.2.1/apc.html
C.1.1 . 建议的最大值
MAX_COLUMNS
Maximum number of columns in Table objects before a PerformanceWarning is issued. This limit is somewhat arbitrary and can be increased.
如果你想要这条路线,只需找到pytables目录中的parameters.py文件并更改MAX_COLUMNS值 .
你应该能够使用pandas数据帧,它可以保存到磁盘而无需转换为csv
恕我直言,这取决于您之后想要对数据做什么,以及您一次需要多少 . 我不得不在不久前 Build 一个统计验证程序,我们有两种方法:
将列拆分为单独的表(例如,使用FK) . 加载它们的开销不是太高
转置表,产生类似键值存储的东西,其中键是(列,行)的元组
对于我们两个使用postgres .
5 回答
事实上,这可能不会以天真的方式进行 . HDF5为每个数据集的元数据分配64 kb的空间 . 该元数据包括列的类型 . 因此,虽然列数是一个软限制,但在2-3万个范围内,您通常会用尽空间来存储元数据(取决于列名的长度等) .
此外,numpy不会将列数限制为32?你现在如何用numpy代表数据?你可以进入一个numpy数组的任何东西都应该对应一个pytables数组类 .
没有pytables,但是使用h5py,这可能有效:
我从this answer借了第一行;不确定这是否适合你 . HDF 5表看起来很好(从hdfview快速查看);当然,我不知道你是否可以将它与pytables和熊猫一起使用 .
也许您可以在不降低性能的情况下增加列数 . 见:http://www.pytables.org/docs/manual-2.2.1/apc.html
C.1.1 . 建议的最大值
MAX_COLUMNS
如果你想要这条路线,只需找到pytables目录中的parameters.py文件并更改MAX_COLUMNS值 .
你应该能够使用pandas数据帧,它可以保存到磁盘而无需转换为csv
恕我直言,这取决于您之后想要对数据做什么,以及您一次需要多少 . 我不得不在不久前 Build 一个统计验证程序,我们有两种方法:
将列拆分为单独的表(例如,使用FK) . 加载它们的开销不是太高
转置表,产生类似键值存储的东西,其中键是(列,行)的元组
对于我们两个使用postgres .