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

时间:2013-03-28 22:04:51

标签: pandas memory hdf5 large-data

简短的问题

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

详细说明

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

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

我已经看到panda.read_table()已经走了很长一段路,但它至少仍然需要与我们想要读取的原始文件大小相同的内存(实际上至少是内存的两倍)进入DataFrame。这可能适用于高达1 GB但高于1 GB的文件?这可能很难,特别是在在线共享机器上。

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

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

侧面问题:磁盘使用情况下hdf5格式是否紧凑?我的意思是,它像xml一样冗长或更像JSON吗? (我知道有索引和东西,但我在这里对数据的简单描述很感兴趣)

1 个答案:

答案 0 :(得分:6)

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

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

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

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

关于HDF5开销:

  

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

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