微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个相当大的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','F','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控制.像你正在做的采取操作(例如非连续的)切片将永远不会给出视图.

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

你的目标是什么?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐