减少Python程序的内存占用

7
我正在使用numpy和pandas在python中开发数据分析工具。由于我需要部署大量的这些工具,因此我希望保持轻量级。
我尝试使用以下代码进行检查:
import logging
import resource
logging.basicConfig(level=logging.DEBUG)

def printmemory(msg):
    currentmemory = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
    logging.debug(msg+': total memory:%r Mb' % (int(currentmemory)/1000000.))

printmemory('begin')

#from numpy import array, nan, mean, std, sqrt, square
import numpy  as np
printmemory('numpy')

import pandas  as pd
printmemory('numpy')

我发现仅仅将numpy和pandas加载到内存中会使我的程序变得非常沉重。是否有减少numpy和pandas内存占用的方法?否则,你有更好的解决方案吗?

5
你可以通过只从每个库中导入你所需的方法和类来减少代码量。例如,如果我只使用 pandas 的 DataFrame,那么可以使用 "from pandas import DataFrame" 而不是 "import pandas"。 - Ryan G
为什么你将msg作为参数传递,却没有对它进行任何操作? - usethedeathstar
编辑过了。这是从之前的编辑中复制/粘贴的。@RyanG,你可以看到有一行被注释掉了,它确实做到了这一点,但似乎并没有影响内存使用量... - Fra
如果选择的方法/类也导入了整个库/其他库,那么就没有办法减少内存使用量。您唯一的选择可能是设置轻量级数据结构,以便每个工作进程不会被相同数据的冗余副本或过多的数据所拖累,这些数据最好分配给不同的工作进程。当然,这取决于您的环境。如果您有更多的核心,则使用更多的较小的工作进程是有意义的,但如果您有大量的内存,则批量处理也不会有害。 - Ryan G
6
我认为,对于一台配备了合理内存的现代计算机来说,加载整个numpy库以及pandas应该不是你最担心的问题。我猜想,如果你真的想让它更轻便,你需要考虑如何将只有实际使用的数据加载到内存中。我听说pytables在这方面表现确实非常好,尽管我自己没有使用过。如果您“仅仅”想利用并行化,则可以尝试使用Cython,其中您可以使用“prange”来并行化循环,并且速度与C语言相当快。 - Magellan88
显示剩余5条评论
2个回答

2
抱歉告诉您,没有办法仅加载 Python 模块的一部分到内存中。如果您的情况适用于多线程,您可以使用多线程 - 线程可以共享相同的模块内存。

0

我不确定您想解决什么问题,但如果您需要并行化numpy,也许pycuda可能适合您。在cuda中并行化numpy和pandas非常完美,但是numpy只会在内存中加载一次,然后在图形卡中的多个进程中启动。 在这里阅读更多信息: https://developer.nvidia.com/pycuda


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接