加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 从pandas数据帧中选择时的内存优化

发布时间:2020-12-20 13:43:59 所属栏目:Python 来源:网络整理
导读:我有一个相当大的pandas数据帧(1.7G),我从中选择一些列进行一些计算(找到三个选定列的最大值).看来这个操作是内存密集型的.我试图找到一种方法来避免这种内存开销. 出于这个问题的目的,我简化了数据框并使用了假数据.我的代码和内存占用量如下所示, from mem
我有一个相当大的pandas数据帧(1.7G),我从中选择一些列进行一些计算(找到三个选定列的最大值).看来这个操作是内存密集型的.我试图找到一种方法来避免这种内存开销.

出于这个问题的目的,我简化了数据框并使用了假数据.我的代码和内存占用量如下所示,

from memory_profiler import profile
import pandas as pnd
import random


@profile
def main():
    cols = [chr(i) for i in range(65,91)]
    d = {}
    n = 1000000
    for c in cols:
        d[c] = [random.randint(0,100) for i in range(n)]
    df = pnd.DataFrame(d)
    items = ['A','F','G']
    a = df[items]
    b = a.max(axis=0)


if __name__ == "__main__":
    main()


Line #    Mem usage    Increment   Line Contents
================================================
     6     42.3 MiB      0.0 MiB   @profile
     7                             def main():
     8     42.3 MiB      0.0 MiB       cols = [chr(i) for i in range(65,91)]
     9     42.3 MiB      0.0 MiB       d = {}
    10     42.3 MiB      0.0 MiB       n = 1000000
    11    240.6 MiB    198.3 MiB       for c in cols:
    12    240.6 MiB      0.0 MiB           d[c] = [random.randint(0,100) for i in range(n)]
    13    446.7 MiB    206.1 MiB       df = pnd.DataFrame(d)
    14    446.7 MiB      0.0 MiB       items = ['A','G']
    15    469.7 MiB     23.1 MiB       a = df[items]
    16    469.8 MiB      0.1 MiB       b = a.max(axis=0)

在上面的操作中,似乎df [items]占用了23MB的内存.我推测这是因为它正在复制df并将其放在’a’中.

有没有办法在选择列时摆脱这种内存开销?

解决方法

Pandas为大多数操作返回副本.某些选择操作可以返回视图,因为内存可能不会被复制并且是底层的numpy视图.这通常由numpy控制.像你正在做的采取操作(例如非连续的)切片将永远不会给出视图.

但是,更重要的是,这实际上并不重要,只要对变量的引用被释放,内存就会被垃圾收集.

你的目标是什么?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读