将通过pandas / pytables编写的大型hdf5转换为vaex

问题描述 投票:0回答:1

我有一个非常大的数据集,我通过如下追加将其大块写入hdf5:

with pd.HDFStore(self.train_store_path) as train_store:
    for filepath in tqdm(filepaths):
        with open(filepath, 'rb') as file:
            frame = pickle.load(file)

        if frame.empty:
            os.remove(filepath)
            continue

        try:
            train_store.append(
                key='dataset', value=frame,
                min_itemsize=itemsize_dict)
            os.remove(filepath)
        except KeyError as e:
            print(e)
        except ValueError as e:
            print(frame)
            print(e)
        except Exception as e:
            print(e) 

数据太大,无法加载到一个DataFrame中,因此我想尝试vaex进行进一步处理。不过,有些事情我还是不太了解。

由于vaex在hdf5中使用的表示形式不同于熊猫/ pytables(VOTable),所以我想知道如何在这两种格式之间进行转换。我尝试将数据分块加载到熊猫中,将其转换为vaex DataFrame,然后存储,但是似乎无法将数据附加到现有的vaex hdf5文件中,至少找不到我可以找到的文件。

真的没有办法从vaex中创建大型hdf5数据集吗?将现有数据集转换为vaex表示(通过python脚本或TOPCAT构造文件)的唯一选择是吗?

关于我的上一个问题,如果我在vaex中使用大型数据集进行核心处理,那么是否有可能将我在vaex中应用的所有转换结果持久保存到hdf5文件中?

python pandas hdf5 pytables vaex
1个回答
0
投票

这种存储格式的问题在于它不是基于列的,因此不适用于具有大量行的数据集,因为例如,如果仅使用一列,则操作系统可能还会读取很大一部分其他列,以及CPU缓存被污染。最好将它们存储为基于列的格式,例如vaex的hdf5格式或箭头。

可以使用以下方法转换为vaex数据框:

import vaex
vaex_df = vaex.from_pandas(pandas_df, copy_index=False)

您可以对每个数据帧执行此操作,然后将它们作为hdf5或箭头存储在磁盘上:

vaex_df.export('batch_1.hdf5')  # or 'batch_1.arrow'

如果您对许多文件执行此操作,则可以懒惰地(即不创建任何内存副本)将它们连接起来,或使用vaex.open函数:

df1 = vaex.open('batch_1.hdf5')
df2 = vaex.open('batch_2.hdf5')
df = vaex.concat([df1, df2]) # will be seen as 1 dataframe without mem copy
df_altnerative = vaex.open('batch*.hdf5')  # same effect, but only needs 1 line

关于您对转换的问题:

如果进行到数据框的转换,则可以写出计算出的值,或获取包含转换的'状态':

import vaex
df = vaex.example()
df['difference'] = df.x - df.y
# df.export('materialized.hdf5', column_names=['difference'])  # do this if IO is fast, and memory abundant
# state = df.state_get()  # get state in memory
df.state_write('mystate.json') # or write as json


import vaex
df = vaex.example()
# df.join(vaex.open('materialized.hdf5'))  # join on rows number (super fast, 0 memory use!)
# df.state_set(state)  # or apply the state from memory
df.state_load('mystate.json')  # or from disk
df
© www.soinside.com 2019 - 2024. All rights reserved.