从Pandas数据帧中选择时的内存优化

2024-05-16 23:39:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个相当大的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'。在

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


Tags: 数据内存inimportpandasdfformain
2条回答

如果您只是在进行计算,您可能不需要选择列到新变量中并创建副本。在

直接应用这个函数-我想这会占用更多的CPU,因为它在计算所有的最大值,然后只得到你想要的,但不会创建一个新的变量。在

df.max()[['A','F','G']]

或者尝试在需要最大值的列之间快速循环,一次只选择一列,尝试返回一个视图(因为您不能使用复杂切片来获取视图)。在

熊猫在大多数操作中都会返回副本。某些选择操作可以返回一个视图,因为内存可能不会被复制,并且是一个底层的numpy视图。这通常是由纽比控制的。像你正在做的一个截取操作(如非连续切片)永远不会给出视图。在

然而,更重要的是,这实际上并不重要,只要变量的引用是release,内存就会被垃圾回收。在

你的目标是什么?在

相关问题 更多 >