- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
通常,当我需要调用一个复杂的公式时,我会将其分解为两行或更多行以使代码更易于理解。但是,在分析一些计算 RMSE 的代码时,我发现这样做似乎会增加代码的内存使用。这是一个简化的示例:
import numpy as np
import random
from memory_profiler import profile
@profile
def fun1():
#very large datasets (~750 mb each)
predicted = np.random.rand(100000000)
observed = np.random.rand(100000000)
#calculate residuals as intermediate step
residuals = observed - predicted
#calculate RMSE
RMSE = np.mean(residuals **2) ** 0.5
#delete residuals
del residuals
@profile
def fun2():
#same sized data
predicted = np.random.rand(100000000)
observed = np.random.rand(100000000)
#same calculation, but with residuals and RMSE calculated on same line
RMSE = np.mean((observed - predicted) ** 2) ** 0.5
if __name__ == "__main__":
fun1()
fun2()
输出:
Filename: memtest.py
Line # Mem usage Increment Line Contents
================================================
5 19.9 MiB 0.0 MiB @profile
6 def fun1():
7 782.8 MiB 763.0 MiB predicted = np.random.rand(100000000)
8 1545.8 MiB 762.9 MiB observed = np.random.rand(100000000)
9 2308.8 MiB 763.0 MiB residuals = observed - predicted
10 2308.8 MiB 0.1 MiB RMSE = np.mean(residuals ** 2) ** 0.5
11 1545.9 MiB -762.9 MiB del residuals
Filename: memtest.py
Line # Mem usage Increment Line Contents
================================================
13 20.0 MiB 0.0 MiB @profile
14 def fun2():
15 783.0 MiB 762.9 MiB predicted = np.random.rand(100000000)
16 1545.9 MiB 762.9 MiB observed = np.random.rand(100000000)
17 1545.9 MiB 0.0 MiB RMSE = np.mean((observed - predicted) **
2) ** 0.5
如您所见,第一个函数(其中计算被拆分)似乎在峰值时需要额外的 ~750 MB - 大概是 residuals
数组的成本。然而,这两个函数都需要创建数组——唯一的区别是第一个函数为其分配了一个名称。这与我对 python 中内存管理的工作方式的理解相反。
那么,这里发生了什么?一种想法是,这可能是 memory_profiler 模块的产物。在运行期间观察 Windows 任务管理器表明了类似的模式(尽管我知道这不是一个非常值得信赖的验证)。如果这是“真实”效果,我对内存处理方式的误解是什么?或者,这是特定于 numpy 的吗?
最佳答案
memory_profiler
的“内存使用情况”列告诉您每行完成后的内存使用情况,而不是该行期间的峰值内存使用情况。在您不保存 residuals
的版本中,该数组在该行完成之前被丢弃,因此它永远不会出现在分析器输出中。
关于python - 为大对象分配名称似乎会大大增加内存使用量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31034740/
我希望有人能解释为什么我的应用程序在加载时使用不同数量的 RAM。我说的是直接使用 exe 的编译版本。这是一个非常基本的应用程序,在应用程序的启动中没有条件分支。然而,每次我启动它时,RAM 量都在
我有一个 inode 使用率为 100% 的磁盘驱动器(使用 df -i 命令)。但是在大量删除文件后,使用率仍然是 100%。 那么正确的做法是什么? 磁盘空间使用量较少的磁盘驱动器怎么可能有Ino
假设我与分支有一个智能合约,其中每个分支都有不同数量的操作。 if (someCondition) { // do operations costing 10 gas } else { //d
是否有一种工具可以在提交到 NEAR 网络之前估算合约调用将产生多少 gas? 最佳答案 目前最好的估计是用runtime-standalone ,它可以处理交易而不必担心共识/网络。这意味着您可以创
我正在使用最新的 SDK 开发适用于 Windows Azure 的应用程序。 目前我正在使用缓存实现 session 提供程序,但模拟器完全不成比例: 缓存被实现为“非常小的”辅助角色(最大 768
我正在为我的 Logstash RAM 问题寻找答案,因为它几乎是 100%。我为它做了很多搜索,但他们没有为我工作。下面的代码是我的 logstash.conf 文件。我认为它需要一些小改动。 Lo
我已经阅读了这里有关此问题的所有其他问题以及互联网其他地方的许多文章。根据this site ,最大内存使用量遵循以下公式: Max memory = [-Xmx] + [-XX:MaxPermSiz
我需要以编程方式增加 Android 中的 RAM 使用量,以观察它随时间的变化。我该怎么做? 我尝试生成很多自定义对象,但生成后意外地 RAM 使用量减少了...我更改了对象数量、结构等,但没有任何
我们使用带有 MMFiles 存储引擎的 ArangoDB 3.3.14(社区版)来处理相对较大的数据集(备份时会超过 30 GB)。我们使用 ECS 在 Docker 容器内运行它。我们的主机虚拟机
我收到了 Hostgator 发来的一条说明,表明他们限制了我对 MYSQL 的访问,因为我的网站使用了太多资源。 通常,在这种情况下,我只会恢复备份以查看最近的更改是否会产生错误。但是,除了写了一些
我使用 TMimeMess 来解码基于 SMTP 服务器的传入电子邮件在突触上。 我发现用于解码 50MB MIME 消息(带有附件),TMimeMess 使用了 600-800MB 的内存。 在这里
我正在打包适用于 iOS 和 Android 的 Adobe Air 应用程序,并且我的 (RAM) 内存使用量超过 100MB。我的游戏(RPG)中有大量 Assets 。 Assets 的数量
我是一名优秀的程序员,十分优秀!