如何从内存中删除 perl 对象

2024-01-06

我编写的 Perl 脚本的内存使用存在一些问题(代码如下)。该脚本启动一些变量,用数据填充它们,然后再次取消定义它们。但是,删除所有内容后脚本的内存使用率仍然很高,无法包含任何数据。

根据ps该脚本在前 39 秒内使用 1.027 Mb 内存 (RSS)(因此 foreach 循环之前的所有内容)。然后,内存使用量开始上升并最终在 204.391 Mb 和 172.410 Mb 之间波动。然而,即使在脚本的最后 10 秒(所有数据都应该被删除),内存使用量也永远不会低于 172.410 Mb。

有没有办法在perl中永久删除变量及其中的所有数据(以减少脚本的内存使用量)?如果是这样,我该怎么办?

use strict;
use warnings;

sleep(30);

my $ELEMENTS = 1_000_000;
my $MAX_ELEMENT = 1_000_000_000;
my $if_condition = 1;

sleep(5);

my %hash = (1 => {}, 2 => {}, 3 => {}, 4 => {});

foreach my $key (keys %hash){
    if( $if_condition ){
        my $arrref1 = [ (rand($MAX_ELEMENT)) x $ELEMENTS ];
        my $arrref2 = [ (rand($MAX_ELEMENT)) x $ELEMENTS ];
        my $arrref3 = [ (rand($MAX_ELEMENT)) x $ELEMENTS ];

        sleep(2);

        if(!defined($hash{$key}->{'amplification'})){
            $hash{$key}->{'amplification'} = [];
        }

        push(@{$hash{$key}->{'amplification'}},@{$arrref1});
        undef($arrref1);
        push(@{$hash{$key}->{'amplification'}},@{$arrref2});
        undef($arrref2);
        push(@{$hash{$key}->{'amplification'}},@{$arrref3});
        undef($arrref3);


        sleep(3);

        delete($hash{$key});

        sleep(5);
    }
}

sleep(10);

Perl 常见问题解答 3 -如何释放数组或散列以使我的程序缩小? http://learn.perl.org/faq/perlfaq3.html#How-can-I-free-an-array-or-hash-so-my-program-shrinks

你通常不能。分配给词法的内存(即 my() 变量) 即使超出范围也无法回收或重复使用。这是 保留以防变量返回范围。分配的内存 全局变量可以通过使用重用(在您的程序内) undef() 和/或delete()。

在大多数操作系统上,分配的内存 程序永远无法返回到系统。这就是为什么 长时间运行的程序有时会自行重新执行。部分经营 系统(特别是使用 mmap(2) 分配大块的系统 内存)可以回收不再使用的内存,但是在这样的情况下 系统中,必须配置和编译 perl 才能使用操作系统的 malloc, 不是 Perl 的。

一般来说,内存分配和释放不是 在 Perl 中你可以或应该非常担心的事情。

也可以看看 “我怎样才能让我的 Perl 程序占用更少的内存?”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从内存中删除 perl 对象 的相关文章

  • .NET 进程分配的内存何时释放回 Windows

    设置 NET 在启动时以及在收集后尝试满足分配请求时 分段为每一代的堆 0 1 2 LOH 分配内存 以获得连续的内存块 为每个堆分配的内存可能会随着应用程序 预热 而趋于平稳 但第 2 代和大型对象堆可能除外 在垃圾收集期间 每个堆 0
  • “get”在 Perl 中不起作用

    我是 Perl 新手 在过去的几天里 我制作了一些简单的脚本 通过 get 将网站的源代码保存到我的计算机上 他们做了他们应该做的事情 但不会获得论坛网站的内容 非论坛网站工作得很好 知道发生了什么事吗 这是问题块 my url http
  • 使用 Perl 写入文件的最简单方法是什么?

    目前我正在使用 system echo panel login panel password root name root pass port panel type gt gt home shared ftp 使用 Perl 做同样的事情最
  • 从 shell 脚本调用 Perl,如何将返回值从 Perl 传递到 shell?

    我成功地从 shell 脚本调用 Perl 脚本 现在我想将 Perl 脚本的返回值传递给 shell 脚本 指示它是否成功 我该怎么做呢 只需使用适当的退出值退出 Perl 脚本即可 exit exit value exit 0 if p
  • Python:当为变量分配新内容时,“旧”内存是否被释放?

    如果为变量分配了任何新内容 为 旧内容 分配的内存是否会 正确 释放 例如 在以下脚本中 在为 a 分配一些新内容后 变量 a 作为零数组的内存是否会被释放 import numpy a numpy zeros 1000 a a 1 我想象
  • 一些涉及类析构函数和删除运算符的内存管理问题?

    在阅读了一些教程后 我仍然不清楚 C 中内存管理的一些观点 1 当使用 new 运算符声明的类超出范围时 是否会调用其析构函数并释放内存 是否有必要调用删除运算符来释放类的内存并调用其析构函数 class Test void newTest
  • 在 Perl 中组装 XML

    我需要对 NetApp 文件管理器进行 API 调用 我知道我需要发送什么原始 XML
  • Java BigDecimal 内存使用情况?

    是否有一个指南来估计一个程序消耗的内存量BigDecimal 寻找与这些类似的东西指导方针 http www javamex com tutorials memory string memory usage shtml用于估计String内
  • Perl LWP::简单 HTTPS 错误

    我正在尝试获取网站的内容并打印 该代码按照我希望的方式在常规 HTTP 网站上运行 但它不适用于 HTTPS 我已经查找了此问题的修复程序 但它们在我的程序中不起作用 这是我目前拥有的代码 usr bin perl use strict u
  • 如何在正则表达式中匹配“/*”?

    stuff d learning perl tmp txt open STUFF stuff or die Cannot open stuff for read while
  • linux + ksh + 向下舍入或向上舍入 - 浮点数

    在我的 ksh 脚本中 我只需要计算整数 有时我会得到浮点数 例如 3 49 或 4 8 等 所以我需要根据以下规则将浮点数转换为整数 示例 3 49 will be 3 2 9 will be 3 4 1 will be 4 23 51
  • 使用 Perl 循环 JSON [重复]

    这个问题在这里已经有答案了 我是 Perl 的新手 想要循环这个 JSON 数据并将其打印到屏幕上 我怎样才能做到这一点 arr Year 2012 Quarter Q3 DataType Other 3 Environment STEVE
  • 将值存储为变量或再次调用方法更好吗?

    最近 我开始学习一些Java 从我对 JVM 的了解来看 JIT 使其在需要 CPU 周期的操作 即调用方法 上变得非常快 但也使其对内存产生了饥饿感 因此 当我需要与以前相同的方法获得相同的输出时 将之前的输出存储在变量中并再次使用它 同
  • 合并 Perl Hashref 和 unique

    我有两个 Perl 哈希值 内容如下 First VAR1 name1 gt adam bob name2 gt Miller Schumacher Second VAR1 name1 gt tina jason jeff
  • 以编程方式获取 Android 设备的所有 RAM 内存,而不仅仅是分配给用户进程的内存

    我有一台设备 我确信它的 RAM 内存为 512 MB 希望能够以编程方式检索该值 512 MB 到目前为止 我在互联网上遇到的主要是这两种方式 https stackoverflow com a 16143065 1521264 http
  • NSAutoreleasePool。什么时候适合创建新的自动释放池?

    在 iOS CocoaTouch 上 我经常看到在方法中创建 NSAutoreleasePool 新实例的代码 我最近在 NSOperation 中看到了一个 设置 NSAutoreleasePool 新实例的基本规则是什么 为什么这比简单
  • 如何使用 Net::SSH::Perl 和公钥?

    我正在尝试使用Net SSH Perl使用公钥与此代码进行连接 my ssh Net SSH Perl gt new host debug gt 1 die 我将密钥放在 root ssh id rsa 和 root ssh identit
  • 为什么子程序需要在声明其中使用的变量之后编写?

    假设我们有这段代码 为什么它会因显式包名称错误而失败 因为该函数仅在声明后才被调用 value use strict use warnings sub print value print n value my value 2 print v
  • NSMutableArray 实例变量内存管理

    我正在做最后一点内存管理整理 但有些东西我不明白 我已经检查了所有文档 Stack Overflow 等 但仍然不明白 我怀疑这与数组有关 我有一个NSMutableArray作为实例变量 我用它来保存从另一个数组中的对象创建的对象 vie
  • 在 Internet Explorer 中使用什么来监视 jscript 内存使用情况

    我们正在调试 GWT 应用程序 在 Firefox 中运行正常 在 IE6 0 中开始运行正常 但一段时间后 它就会崩溃并开始爬行 经过一些测试后 我们怀疑存在一些内存问题 使用了太多内存 内存泄漏等 除了使用taskmanager和pro

随机推荐

  • 签入范围前提条件

    我喜欢番石榴前提条件 但我真正需要的是另一种方法 检查数字是否在范围内 像这样的smt probably there should be checkStateInRange also public static void checkArgu
  • 发送 HTTP 时的 OutputStream OutOfMemoryError

    我正在尝试将大型视频 图像文件从本地文件系统发布到 http 路径 但一段时间后遇到内存不足错误 这是代码 public boolean publishFile URI publishTo String localPath throws E
  • 有没有办法限制或限制 PostgreSql 中的用户或连接?

    我们有一个设置 其中数据库实例在多个用户之间共享 我们正在尝试对共享 PostgreSQL 实施某种形式的节流或速率限制 以便一个用户不会因消耗所有资源而导致其他用户挨饿 我们可以想到的一种方法是添加连接池并固定我们为每个租户提供的连接数量
  • C++17 中数组索引范围的并行 for 循环

    我需要更新一个 100M 元素的数组 并且希望并行执行 std for each std execution par 看起来很棒 除了更新需要根据我正在更新的索引访问其他数组的元素 最小的serial我尝试并行化的工作示例可能如下所示 fo
  • PHP/Apache 自定义文件类型处理

    我想知道是否可以为 Apache 创建由 PHP 文件处理的自定义文件类型处理 我想要完成的是创建一种自定义 phps用于在浏览器中查看代码的扩展 我正在使用 CodeMirror 来显示代码 但我希望此过程能够自动化 因为我只需更改 ph
  • 如何使 log4j syslog Appender 在一行中写入堆栈跟踪?

    我正在使用 log4j syslog 附加程序 并注意到当发生异常时 附加程序将堆栈跟踪中的每个条目写入新行 有没有一种方法可以对其进行配置 以便整个堆栈跟踪将作为一行而不是多行 我正在使用以下 log4j2 配置 该配置可以很好地发送到
  • 如何使用 ALAssetsLibrary 枚举 iOS 8 上的所有照片

    iOS 8 通过从 ALAssetsLibrary 枚举 API 中删除 相机胶卷 来破坏许多应用程序 我知道我可以使用新的照片框架获取所有照片 但我的应用程序有很多代码取决于 ALAsset 相关类 我需要保持 iOS 7 支持 有没有办
  • iOS将RotateToInterfaceOrientation正确使用

    我有一个非常简单的 UIViewController 我正在尝试弄清楚如何使用 willRotateToInterfaceOrientation 我的 UIViewController 有一个非常简单的 viewDidLoad 方法 voi
  • Oracle 使用 UNION ALL 语句 FETCH FIRST 1 ROW

    我正在尝试使用 FETCH FIRST 1 ROW 在 SQL 中创建 UNION ALL 语句 但是当我这样做时 它给了我一个错误MISSING KEYWORD 我的 SQL 如下所示 Select From tabl1 where Da
  • 内容脚本未从后台脚本接收消息 (Mv3)

    我制作了这个简单的消息传递示例 chrome 扩展 其中应该将消息从后台脚本发送到内容脚本 不幸的是 内容脚本似乎没有收到该消息 后台脚本 background js function sendMessage tabId hostname
  • VSCode:在项目中打开文件

    我正在使用 Mac OS X 和 Visual Studio Code 0 10 10 如何使用键盘在当前打开的项目中使用其部分名称打开文件 我在命令面板中找不到可以执行此操作的命令 有一个命令可以对工作文件执行此操作 请参见屏幕截图 但是
  • 在 Matlab 循环中对变量执行某些操作比不执行任何操作要快

    在分析一个简单的循环有多快的过程中 我遇到了这个奇怪的现象 对变量不执行任何操作比对其执行某些操作要慢得多 当然 这不是一个真正的问题 因为您不会经常感到编写什么都不做的代码的冲动 但这让我感到惊讶 所以我想知道是否有人理解正在发生的事情以
  • 同时保留原始变量和解构的干净方法

    有没有更干净的方法来做到这一点 至少是 ES 草案并且有 babel 插件 即 ES6 ES7 等 const a b result doSomething 我想将整体结果保留为一个单一的对象 但同时也对其进行解构 从技术上讲它是有效的 但
  • 获取参数编码

    我在 GET 请求中使用 spring mvc 和特殊字符时遇到问题 考虑以下方法 RequestMapping update public Object testMethod RequestParam String name throws
  • C 中文件范围内可变修改的数组

    我有一些这样的代码 static int a 6 static int b 3 static int Hello a b 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 但是当我编译它时 它说错误 在文件范围内可变地
  • 使用 Java-JDBC 从 Oracle 数据库读取数据时的字符编码

    我们的数据存储在 oracle 10g db 中 其中包含法语字符集 要求是使用 Java 读取数据并生成输出文件 我通过 SQL plus 检查了 Oracle db 中数据的有效性 看起来不错 从窗口 set NLS LANG AMER
  • Android 应用内购买问题

    我已使用静态响应 ID 在我的帐户中实现了应用内购买android test purchased 现在购买该商品时Toast弹出窗口说 谢谢 您的物品很快就会出现 我认为到目前为止一切都很完美 我的问题是 这是哪里做的Toast来自 我找不
  • 将简单元数据附加到 MySQL 数据库

    有没有办法将一段元数据附加到 MySQL 数据库 我正在尝试编写代码 以便在代码升级需要时自动更新数据库架构 这需要存储单个整数值 模式版本 我当然可以为其创建一个完整的表格 但这对于一个简单的数字来说似乎有点过分了 您可以使用表注释来存储
  • 如何访问默认的 iOS 声音并将其设置为通知声音?

    如何访问默认的 iOS 声音 三音 编钟 玻璃 喇叭 铃声 电子 以将其设置为本地通知声音 我已经创建了本地通知 一切正常 但使用默认声音 三音 我想使用 Chime 或其他 我只知道如何使用我自己的声音文件 localNotif soun
  • 如何从内存中删除 perl 对象

    我编写的 Perl 脚本的内存使用存在一些问题 代码如下 该脚本启动一些变量 用数据填充它们 然后再次取消定义它们 但是 删除所有内容后脚本的内存使用率仍然很高 无法包含任何数据 根据ps该脚本在前 39 秒内使用 1 027 Mb 内存