当我使用pandas将csv文件转换为hdf5文件时,生成的文件非常大。例如,一个170Mb的测试csv文件(23列,130万行)会生成一个2Gb的hdf5文件。但是,如果绕过pandas并直接写入hdf5文件(使用pytables),则只有20Mb。在以下代码(用于在pandas中进行转换)中,dataframe中对象列的值显式转换为字符串对象(以防止pickling):
# Open the csv file as pandas data frame
data = pd.read_csv(csvfilepath, sep=delimiter, low_memory=False)
# Write the resulting data frame to the hdf5 file
data.to_hdf(hdf5_file_path, table_name, format='table', complevel=9,
complib='lzo')
这是已检查的hdf5文件(使用vitables):
我觉得奇怪的是,这些值被表示为(python?)按数据类型(values_block0:int、values_block1:float和values_block2:string)列出,而不是按csv文件中的每一列列出一个特定列。我想知道这是否会导致大文件大小以及对查询时间的影响?
考虑到需要转换约1Tb,我想知道如何减少生成的hdf5文件的大小?
附则。 我知道这个question但是它指出,大的hdf5文件大小是由hdf5格式本身引起的,在本例中,这不是原因,因为绕过pandas导致的hdf5文件要小得多。
p.p.S.公司。 使用data.iloc代替joris建议的data.loc没有任何区别。 我已经删除了“转换”,这没什么区别。Jeff请求的读取数据帧信息:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1303331 entries, 0 to 1303330
Columns: 23 entries, _PlanId to ACTIVITY_Gratis
dtypes: float64(1), int64(5), object(17)
Here's各种IO方法的时间/大小的非正式比较
在64位linux上使用0.13.1
设置
多种方式储蓄
磁盘上的大小将是为每列选择的字符串大小的函数;如果不使用数据列,则是任何字符串的最长大小。因此,使用数据列进行写操作可能与此处的大小相同(这与您拥有更多列以便每列占用更多空间这一事实相平衡)。您可能想指定
min_item_size
来控制see here下面是磁盘上结构的示例:
数据类型正在分组为块(如果有数据列,则它们是独立的)。这些只是这样打印的;它们像数组一样存储。
相关问题 更多 >
编程相关推荐