我有一个相当大的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'。在
有没有办法在选择列时消除这种内存开销?在
如果您只是在进行计算,您可能不需要选择列到新变量中并创建副本。在
直接应用这个函数-我想这会占用更多的CPU,因为它在计算所有的最大值,然后只得到你想要的,但不会创建一个新的变量。在
或者尝试在需要最大值的列之间快速循环,一次只选择一列,尝试返回一个视图(因为您不能使用复杂切片来获取视图)。在
熊猫在大多数操作中都会返回副本。某些选择操作可以返回一个视图,因为内存可能不会被复制,并且是一个底层的numpy视图。这通常是由纽比控制的。像你正在做的一个截取操作(如非连续切片)永远不会给出视图。在
然而,更重要的是,这实际上并不重要,只要变量的引用是release,内存就会被垃圾回收。在
你的目标是什么?在
相关问题 更多 >
编程相关推荐