我有超过500个PyTables
商店,每个商店包含大约300Mb的数据。我想使用pandas append
将这些文件合并到一个大商店中,如下面的代码所示。
def merge_hdfs(file_list, merged_store):
for file in file_list:
store = HDFStore(file, mode='r')
merged_store.append('data', store.data)
store.close()
追加操作非常慢(将单个商店附加到merged_store
最多需要10分钟),奇怪的是,merged_store
的文件大小似乎每增加1Gb存储。
我已经指出了根据文档应该提高性能的预期行总数,并且已经读过Improve pandas (PyTables?) HDF5 table write performance我期待大的写入时间,但是每300Mb差不多10分钟似乎太慢了,我无法理解为什么会增加尺寸。
我想知道我是否遗漏了什么?
有关其他信息,请参阅500 PyTable中的一个。
/data/table (Table(272734,)) ''
description := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"values_block_0": Float64Col(shape=(6,), dflt=0.0, pos=1),
"id": StringCol(itemsize=11, shape=(), dflt='', pos=2),
"datetaken": Int64Col(shape=(), dflt=0, pos=3),
"owner": StringCol(itemsize=15, shape=(), dflt='', pos=4),
"machine_tags": StringCol(itemsize=100, shape=(), dflt='', pos=5),
"title": StringCol(itemsize=200, shape=(), dflt='', pos=6),
"country": StringCol(itemsize=3, shape=(), dflt='', pos=7),
"place_id": StringCol(itemsize=18, shape=(), dflt='', pos=8),
"url_s": StringCol(itemsize=80, shape=(), dflt='', pos=9),
"url_o": StringCol(itemsize=80, shape=(), dflt='', pos=10),
"ownername": StringCol(itemsize=50, shape=(), dflt='', pos=11),
"tags": StringCol(itemsize=505, shape=(), dflt='', pos=12)}
byteorder := 'little'
chunkshape := (232,)
答案 0 :(得分:3)
这基本上就是我最近回答的答案here。
这就是底线,您需要关闭索引store.append('df',df,index=False)
。创建商店时,最后将其编入索引。
此外,在合并表格时也会关闭压缩。
索引是一项相当昂贵的操作,如果我没记错的话,只使用一个处理器。
最后,确保您创建与mode='w'
合并的所有后续操作都附加,并且您希望以干净的新文件开始。
我也不会事先指定chunksize
。相反,在创建最终索引之后,使用ptrepack
执行压缩并指定chunksize=auto
,它将为您计算。我不认为这会影响写入性能,但会优化查询性能。
您可以尝试将chunksize
参数调整为append
(这是写入chunksize)也可以调整为更大的数字。
显然要确保每个附加表具有完全相同的结构(如果不是这样,则会引发)。
我创建了此问题以进行增强,以“内部”执行此操作:https://github.com/pydata/pandas/issues/6837