我有一个相当大的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] 举报,一经查实,本站将立刻删除。