我在openvms系统中使用32位perl。(因此perl可以访问直到2gb的虚拟地址空间)。
我正在打击"内存不足!"在一个大的perl脚本中。我把变量的位置归零了。然而,在我使用devel测试之后:大小结果表明数组只使用了13 Mb的内存,并且哈希的使用量远低于此。
我的问题是关于在VMS中对这个perl脚本进行内存分析。
有没有一种在VMS上进行内存配置文件的好方法?
我使用size来获取数组和散列的大小。(Array是局部作用域,hash是全局作用域)
DV Z01 A4:[INTRO_DIR]$ perl scanner_SCANDIR.PL
Directory is Z3:[new_dir]
13399796 is total on array
3475702 is total on hash
Directory is Z3:[new_dir.subdir]
2506647 is total on array
4055817 is total on hash
Directory is Z3:[new_dir.subdir.OBJECT]
5704387 is total on array
6040449 is total on hash
Directory is Z3:[new_dir.subdir.XFET]
1585226 is total on array
6390119 is total on hash
Directory is Z3:[new_dir.subdir.1]
3527966 is total on array
7426150 is total on hash
Directory is Z3:[new_dir.subdir.2]
1698678 is total on array
7777489 is total on hash
答案 0 :(得分:2)
(编辑:Pmis-spelled GFLQUOTA) 输出来自哪里?对于OpenVMS人员,它建议目录中的文件,代码可能会吮吸?每个元素通常会有相当大的malloc / align开销。
无论如何,在OpenVMS上严格使用32个指针时,可用的ADDRESSABLE内存为1GB:0x0 ... 0x3fffffff,而不是2GB,用于' P0'的程序和(malloc)数据。空间。 P1(0x7fffffff .. 0x4000000)中还有用于线程局部堆栈存储的空间,但perl不使用(很多)。 从第二个会话开始,您可以使用DCL查看:
$ pid = "xxxxxxxx"
$ write sys$output f$getjpi(pid,"FREP0VA"), " ", f$getjpi(pid,"FREP1VA")
$ write sys$output f$getjpi(pid,"PPGCNT"), " ", f$getjpi(pid,"GPGCNT")
$ write sys$output f$getjpi(pid,"PGFLQUOTA")
但是......这些只是地址范围,而不是允许进程使用多少内存。它由进程页面文件配额管理。在运行perl之前检查$ SHOW PROC / QUOTA。并且可以从外部报告其使用情况,如上所述,添加私人页面和组共享页面。
查看内存(和其他配额)的另一个好方法是SHOW PROC / CONT ...然后点击" q"
那么每个大型活动数组中存储了多少个元素?平均元素有多大,四舍五入到16个字节?哈希元素有多少?键值+平均值有多大(慷慨地舍入)
确切的信息是什么?
该计划是否会“打击”#39;马上或一段时间后(所以你可以使用SHOW PROC / CONT)
是否有可用的源文件数据集(大小)?
干杯, 海因。