在python 3.7.2中导入numpy后的RAM使用情况

在python 3.7.2中导入numpy后的RAM使用情况,python,numpy,conda,ram,Python,Numpy,Conda,Ram,我使用python 3.7.2 win32运行conda 4.6.3。在python中,当我导入numpy时,我看到RAM使用量增加了80MB。由于我使用多处理,我想知道这是否正常,是否有任何方法可以避免这种RAM开销?请参阅以下相关软件包的所有版本(来自conda列表): python……….3.7.2 h8c8aaf0_2 mkl_fft……….1.0.10 py37h14836fe_0 mkl_随机..1.0.2 py37h343c172_0 numpy……….1.15.4 py37h19

我使用python 3.7.2 win32运行conda 4.6.3。在python中,当我导入numpy时,我看到RAM使用量增加了80MB。由于我使用多处理,我想知道这是否正常,是否有任何方法可以避免这种RAM开销?请参阅以下相关软件包的所有版本(来自conda列表):

python……….3.7.2 h8c8aaf0_2

mkl_fft……….1.0.10 py37h14836fe_0

mkl_随机..1.0.2 py37h343c172_0

numpy……….1.15.4 py37h19fb1c0\u 0

numpy base..1.15.4 py37hc3f5095_0


谢谢

你无法避免这一成本,但它可能没有看上去那么糟糕。
numpy
库(仅C的一个副本
libopenblasp
,加上所有Python
numpy
扩展模块)在磁盘上占用了超过60MB的空间,它们在导入时都将被内存映射到Python进程中;添加所有Python模块以及加载和初始化所有模块所涉及的动态分配内存,以及报告的80MB增加的RAM使用量是很正常的

也就是说:

  • C库和Python扩展模块是内存映射的,但这并不意味着它们占用“真正的”RAM;如果给定页面中的代码路径未被执行,则该页面将永远不会加载,或在内存压力下被丢弃(甚至不会写入页面文件,因为它始终可以从原始DLL重新加载)
  • 在类UNIX系统上,当您使用fork时(
    多处理
    在默认情况下在除Windows以外的任何地方都执行此操作),则在“写时复制”模式下,父进程和工作进程之间共享内存。由于代码本身通常不被编写,唯一的成本是页表本身(它们引用的内存的一小部分),并且父级和子级都将共享该RAM
  • 不幸的是,在Windows上,
    fork
    不是一个选项(除非你在Windows上运行Ubuntu
    bash
    ,在这种情况下,它仅仅是Windows,实际上是Linux),所以你可能会在每个进程中支付更多的内存成本。但是,即使在那里,
    libopenblasp
    ,支持大部分
    numpy
    的C库,也会在每个进程中重新映射,但是操作系统应该在进程之间正确地共享只读内存(以及Python扩展模块的大部分,如果不是全部的话)

    基本上,在这真的引起问题之前(而且不太可能),不要担心它。

    是使用Python进行科学计算的基本包

    它是一个大的包,设计用于处理大型数据集,并(主要)针对速度进行了优化
    如果查看它的uu init_uuu.py(在导入它时执行)(例如:
    import numpy
    ),您会注意到它导入了很多项(包/模块):

    • 这些项目本身可能会导入其他项目
    • 其中一些是扩展模块(.pyd(.dll)或.sos),它们被加载到当前流程中(以及它们的依赖项)
    我准备了一个演示

    code.py:

    #/usr/bin/env蟒蛇3
    导入系统
    导入操作系统
    导入psutil
    #导入pprint
    def main():
    display_text=“此{:s}屏幕截图已拍摄。按继续…”
    pid=os.getpid()
    打印(“Pid:{:d}\n.”格式(Pid))
    p=psutil.Process(pid=pid)
    mod_names0=set(k表示系统模块中的k)
    mi0=p.内存信息()
    输入(显示文本格式(“第一”))
    进口numpy
    输入(显示文本格式(“秒”))
    mi1=p.内存信息()
    对于idx,枚举中的mi([mi0,mi1],start=1):
    打印(“\n内存信息({:d}):{:}”。格式(idx,mi))
    打印(“\nExtra模块由“{:s}”导入):”。格式(numpy.\uuuu name\uuuuu))
    打印(已排序(设置(系统模块中的k代表k)-模块名称0))
    #pprint.pprint({k:v代表k,v在sys.modules.items()中,如果k不在mod_names0})
    打印(“\n完成”)
    如果名称=“\uuuuu main\uuuuuuuu”:
    打印(“Python{:s}on{:s}\n.”格式(sys.version,sys.platform))
    main()
    
    输出

    [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q054675983]>“e:\Work\Dev\VEnvs\py\u 064\u 03.06.08\u test0\Scripts\python.exe”code.py
    win32上的Python 3.6.8(tags/v3.6.8:3C6B436A572018年12月24日00:16:47)[MSC v.1916 64位(AMD64)]
    Pid:27160
    这是第一张截图。按继续。。。
    这是第二张截图。按继续。。。
    内存信息(1):pmem(rss=15491072,vms=8458240,num_page_faults=4149,peak_wset=15495168,wset=15491072,peak_paged_pool=181160,paged_pool=180984,peak_nonpaged_pool=13720,nonpaged_pool=13576,pagefile=8458240,peak_pagefile=8458240,private=8458240)
    内存信息(2):pmem(rss=27156480,vms=253882368,num_page_faults=7283,peak_wset=27205632,wset=27156480,peak_paged_pool=272160,paged_pool=272160,peak_nonpaged_pool=21640,nonpaged_pool=21056,pagefile=253882368,peak_pagefile=253972480,private=253882368)
    “numpy”导入的额外模块:
    [“'u ast'、'u bisect'、'u blake2'、'u compat'u pickle'、'u ctypes'、'u decimal'、'u hashlib'、'u pickle'、'u random'、'u sha3'、'u string'、'u struct'、'argparse'、'ast'、'atexit'、'bisect'、'copy'、'ctypes'、'ctypes.'u endian'、'cython'u运行时'、'decimal'、'difflib'、'gc'、'gettext'、'hashlib'、'logging'、'mtrand'、'mRand'、'numbers'、'numbers'、'numbers'、'_分发服务器\u init',numpy.\u globals',numpy.\u import\u tools',numpy.add\u newdocs',numpy.compat',numpy.compat.\u inspect',numpy.compat.py3k',numpy.core',numpy.core.\u internal',numpy.core.\u方法',numpy.core.\u多数组测试',numpy.core.arrayprint',numpy.core.defcharray',.deffarrary',numpy.core.einsumpye、 函数'u base'、'numpy.core.getlimits'、'numpy.core.info'、'numpy.core.machar'、'numpy.core.memmap'、'numpy.core.multiarray'、'numpy.core.numeric'、'numpy.core.records'、'numpy.core.shape'base'、'numpy.core.umath'、'numpy.ctypeslib'、'numpy.fft.ffck'、'numpy.fft.tpack.lite'、'numpy.fftF
    
    [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q054675983]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" code.py
    Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32
    
    Pid: 27160
    
    This first screenshot was taken. Press <Enter> to continue ...
    This second screenshot was taken. Press <Enter> to continue ...
    
    Memory info (1): pmem(rss=15491072, vms=8458240, num_page_faults=4149, peak_wset=15495168, wset=15491072, peak_paged_pool=181160, paged_pool=180984, peak_nonpaged_pool=13720, nonpaged_pool=13576, pagefile=8458240, peak_pagefile=8458240, private=8458240)
    
    Memory info (2): pmem(rss=27156480, vms=253882368, num_page_faults=7283, peak_wset=27205632, wset=27156480, peak_paged_pool=272160, paged_pool=272160, peak_nonpaged_pool=21640, nonpaged_pool=21056, pagefile=253882368, peak_pagefile=253972480, private=253882368)
    
    Extra modules imported by `numpy` :
    ['_ast', '_bisect', '_blake2', '_compat_pickle', '_ctypes', '_decimal', '_hashlib', '_pickle', '_random', '_sha3', '_string', '_struct', 'argparse', 'ast', 'atexit', 'bisect', 'copy', 'ctypes', 'ctypes._endian', 'cython_runtime', 'decimal', 'difflib', 'gc', 'gettext', 'hashlib', 'logging', 'mtrand', 'numbers', 'numpy', 'numpy.__config__', 'numpy._distributor_init', 'numpy._globals', 'numpy._import_tools', 'numpy.add_newdocs', 'numpy.compat', 'numpy.compat._inspect', 'numpy.compat.py3k', 'numpy.core', 'numpy.core._internal', 'numpy.core._methods', 'numpy.core._multiarray_tests', 'numpy.core.arrayprint', 'numpy.core.defchararray', 'numpy.core.einsumfunc', 'numpy.core.fromnumeric', 'numpy.core.function_base', 'numpy.core.getlimits', 'numpy.core.info', 'numpy.core.machar', 'numpy.core.memmap', 'numpy.core.multiarray', 'numpy.core.numeric', 'numpy.core.numerictypes', 'numpy.core.records', 'numpy.core.shape_base', 'numpy.core.umath', 'numpy.ctypeslib', 'numpy.fft', 'numpy.fft.fftpack', 'numpy.fft.fftpack_lite', 'numpy.fft.helper', 'numpy.fft.info', 'numpy.lib', 'numpy.lib._datasource', 'numpy.lib._iotools', 'numpy.lib._version', 'numpy.lib.arraypad', 'numpy.lib.arraysetops', 'numpy.lib.arrayterator', 'numpy.lib.financial', 'numpy.lib.format', 'numpy.lib.function_base', 'numpy.lib.histograms', 'numpy.lib.index_tricks', 'numpy.lib.info', 'numpy.lib.mixins', 'numpy.lib.nanfunctions', 'numpy.lib.npyio', 'numpy.lib.polynomial', 'numpy.lib.scimath', 'numpy.lib.shape_base', 'numpy.lib.stride_tricks', 'numpy.lib.twodim_base', 'numpy.lib.type_check', 'numpy.lib.ufunclike', 'numpy.lib.utils', 'numpy.linalg', 'numpy.linalg._umath_linalg', 'numpy.linalg.info', 'numpy.linalg.lapack_lite', 'numpy.linalg.linalg', 'numpy.ma', 'numpy.ma.core', 'numpy.ma.extras', 'numpy.matrixlib', 'numpy.matrixlib.defmatrix', 'numpy.polynomial', 'numpy.polynomial._polybase', 'numpy.polynomial.chebyshev', 'numpy.polynomial.hermite', 'numpy.polynomial.hermite_e', 'numpy.polynomial.laguerre', 'numpy.polynomial.legendre', 'numpy.polynomial.polynomial', 'numpy.polynomial.polyutils', 'numpy.random', 'numpy.random.info', 'numpy.random.mtrand', 'numpy.testing', 'numpy.testing._private', 'numpy.testing._private.decorators', 'numpy.testing._private.nosetester', 'numpy.testing._private.pytesttester', 'numpy.testing._private.utils', 'numpy.version', 'pathlib', 'pickle', 'pprint', 'random', 'string', 'struct', 'tempfile', 'textwrap', 'unittest', 'unittest.case', 'unittest.loader', 'unittest.main', 'unittest.result', 'unittest.runner', 'unittest.signals', 'unittest.suite', 'unittest.util', 'urllib', 'urllib.parse']
    
    Done.