我有超过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
文件的大小似乎会增加1 GB。
根据文档,我已经指定了预期行数,这应该可以提高性能。我读了Improve pandas (PyTables?) HDF5 table write performance,并期望有较长的写入时间,但每300 MB几乎需要10分钟似乎太慢了,而且我无法理解为什么会增加大小。
我想知道是否有什么我错过了?
附加信息:以下是500个PyTables中的一个描述。
/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,)
append
操作中出现错误)。这些表并不完全相同,它们的大小也略有不同,但我已经为合并后的表保持了相同的min_itemsize
参数,因此我不希望字符串的大小发生变化... - danielebmin_itemsize
参数生成的(并且包含固定最大长度的字符串),我假设合并后的表的字段将自动创建正确的大小,而无需显式传递min_itemsize
参数给追加函数。我现在已经这样做了,一切似乎都很好。我会遵循您有关压缩的建议,再次感谢您的帮助! - danieleb