调用函数时的 Pandas、大数据、HDF 表和内存使用情况

Posted

技术标签:

【中文标题】调用函数时的 Pandas、大数据、HDF 表和内存使用情况【英文标题】:Pandas, large data, HDF tables and memory usage when calling a function 【发布时间】:2013-03-19 13:10:26 【问题描述】:

小问题

当 Pandas 在 HDFStore 上工作时(例如: .mean() 或 .apply() ),它是将完整数据作为 DataFrame 加载到内存中,还是作为 Serie 逐记录处理?

详细说明

我要处理大型数据文件,我可以指定数据文件的输出格式。

我打算使用 Pandas 来处理数据,并且我想设置最佳格式以最大限度地提高性能。

我已经看到 panda.read_table() 已经走了很长一段路,但它仍然至少需要与我们想要读取以进行转换的原始文件大小一样多的内存(实际上至少是内存的两倍)进入数据框。这可能适用于最大 1 GB 的文件,但高于?这可能很难,尤其是在在线共享机器上。

但是,我看到现在 Pandas 似乎支持使用 pytables 的 HDF 表。

我的问题是:当我们对整个 HDF 表进行操作时,Pandas 是如何管理内存的?例如 .mean() 或 .apply()。它是先将整个表加载到 DataFrame 中,还是直接从 HDF 文件中处理函数而不存储在内存中?

附带问题:hdf5 格式在磁盘使用上是否紧凑?我的意思是,它是像 xml 那样冗长还是更像 JSON? (我知道有索引和东西,但我在这里对数据的简单描述感兴趣)

【问题讨论】:

回答我的问题,似乎使用HDF5确实有开销,我无法量化它,但如果数据足够大,使用压缩可以获得比1更好的比率: 1,因此它会比 CSV 文件更好(因为 HDF5 支持动态压缩)。见***.com/questions/14332193/hdf5-storage-overhead 找到更多信息来量化 HDF5 文件存储开销:hdfgroup.org/HDF5/doc1.6/Chunking.html#S5 当您引用存储在 HDF 文件中的 pandas 对象时,它会立即拉回整个结构。使用store.select 时可以使用迭代器和块大小选项,但您必须自己管理聚合。这在计算平均值时非常简单。 【参考方案1】:

我想我找到了答案:是与否,这取决于您如何加载 Pandas DataFrame。

与 read_table() 方法一样,您有一个“迭代器”参数,它允许获取一个生成器对象,该对象一次只能获取一条记录,如下所述:http://pandas.pydata.org/pandas-docs/dev/io.html#iterator

现在,我不知道 .mean() 和 .apply() 之类的函数如何与这些生成器一起使用。

如果有人有更多信息/经验,请随时分享!

关于 HDF5 开销:

HDF5 在内存中保留了一个 B-tree,用于将块结构映射到 磁盘。为数据集分配的块越多,数据集越大 B树。大型 B 树占用内存并导致文件存储开销为 以及更多的磁盘 I/O 和更高的元数据缓存争用。 因此,在内存和 I/O 之间取得平衡很重要 开销(小 B 树)和访问数据的时间(大 B 树)。

http://pytables.github.com/usersguide/optimization.html

【讨论】:

以上是关于调用函数时的 Pandas、大数据、HDF 表和内存使用情况的主要内容,如果未能解决你的问题,请参考以下文章

Pandas + HDF5 Panel 大数据存储

Pandas系列之入门篇——HDF5

是否可以直接重命名存储在 hdf5 文件中的 pandas 数据框的列?

使用熊猫将 CSV 文件转换为 HDF5

使用 pandas 读取 hdf5 数据集

Pandas只提供了读取啥文件的函数?