【发布时间】:2021-07-13 09:18:48
【问题描述】:
我正在研究Ptera Software,这是一个开源空气动力学求解器。这是我分发的第一个包,我遇到了一些与内存管理相关的问题。
具体来说,导入我的包会占用大量内存。我上次检查时,它占用了大约 136 MB 的 RAM。 PyPI 将包大小列为 118 MB,这似乎也很高。作为参考,NumPy 只有 87 MB。
起初,我以为我可能不小心在包中包含了一些巨大的文件。所以我从 PyPI 下载了每个版本的 tar.gz 文件并解压出来。解压后没有超过 1 MB。
这让我相信我导入需求的方式有问题。我的 REQUIREMENTS.txt 文件如下所示:
matplotlib >= 3.2.2, < 4.0.0
numpy >= 1.18.5, < 2.0.0
pyvista >= 0.29.0, < 1.0.0
scipy >= 1.5, < 2.0
numba >= 0.53, <1.0
也可能是我弄乱了我的 __init__.py 文件。它看起来像这样:
from pterasoftware import aerodynamics
from pterasoftware import airfoils
from pterasoftware import geometry
from pterasoftware import meshing
from pterasoftware import movement
from pterasoftware import operating_point
from pterasoftware import output
from pterasoftware import problems
from pterasoftware import steady_horseshoe_vortex_lattice_method
from pterasoftware import steady_ring_vortex_lattice_method
from pterasoftware import unsteady_ring_vortex_lattice_method
目录结构如下:
├───pterasoftware
│ ├───airfoils
│ │ └───naca0012.dat
│ ├───__init__.py
│ ├───aerodynamics.py
│ ├───geometry.py
│ ├───meshing.py
│ ├───movement.py
│ ├───operating_point.py
│ ├───output.py
│ ├───problems.py
│ ├───steady_horsehoe_vortex_lattice_method.py
│ ├───steady_ring_vortex_lattice_method.py
│ └───unsteady_ring_vortex_lattice_method.py
我知道导入 numpy、matplotlib 和 scipy 等大型包可能会占用大量内存。但是,我知道有很多使用这些资源的包,它们的导入不需要接近 136 MB。我在这里错过了什么?
这是我用来测试导入包时分配的内存的代码:
from memory_profiler import profile
@profile
def find_import_memory_usage():
import pterasoftware as ps
if __name__ == "__main__":
find_import_memory_usage()
【问题讨论】:
-
我真的看不出这里有什么问题。不要忘记 numpy、numba 和许多其他 Python 包的开销很大,因为它们不是原生 Python,而是用 C 编写的。如果您可以分享一些比较数据。
-
PyPI 显示你的包小于 70 KB,这是正常的。安装时,依赖项(包括所有瞬态依赖项)可以在 venv 中轻松累积到 100-200 MB,这也很好。例如,我必须维护一个 300 KB 的项目,该项目拉取
torch依赖项,该依赖项将近 1 GB。 -
查看代码,开销可能来自 numba 将很多东西编译到内存中(不过我可能错了)。
标签: python numpy import pip package