pandas pytables追加:性能和文件大小的增加

时间:2014-04-08 11:01:52

标签: python performance pandas hdfs pytables

我有超过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,)

1 个答案:

答案 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