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

标签 pandas memory hdf5 large-data

简短问题

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

详细描述

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

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

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

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

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

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

最佳答案

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

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

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

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

关于 HDF5 开销:

HDF5 keeps a B-tree in memory that is used to map chunk structures on disk. The more chunks that are allocated for a dataset the larger the B-tree. Large B-trees take memory and cause file storage overhead as well as more disk I/O and higher contention forthe metadata cache. Consequently, it’s important to balance between memory and I/O overhead (small B-trees) and time to access data (big B-trees).

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

关于Pandas、大数据、HDF 表以及调用函数时的内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15692984/

相关文章:

Python pandas插值系列

c - 如何使用引用了内存中存储的inode创建虚拟文件

opencv - 是否可以在OpenCV的特定图像上存储数据?

macos - 使用 MMAP 读取时 OS X 上的页面错误

python - 为基于 2D 条件的子集索引大型 3D HDF5 数据集

python - 从 hdf5 文件中读取特定列并通过条件

python - Pandas:上传到 mysql 表

python - Pandas 根据条件获取行 ID

python - 如何检查变量是 python 列表、numpy 数组还是 pandas 系列

c++ - 如何对hdf5时间序列进行查询