0

我在我的 openvms 系统中使用 32 位 perl。(所以 perl 最多可以访问 2gb 的虚拟地址空间)。

我正在点击“内存不足!” 在一个大的 perl 脚本中。我把变量的位置归零导致这个。然而,在我使用 devel:size 进行测试后,事实证明该数组仅使用 13 Mb 内存,而哈希使用的内存远少于此。

我的问题是关于在 VMS 中对这个 perl 脚本进行内存分析。

有没有在 VMS 上做内存配置文件的好方法?

我使用 size 来获取数组和哈希的大小。(数组是本地范围,哈希是全局范围)

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
4

1 回答 1

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 个字节?有多少个哈希元素?键 + 值平均有多大(大方地四舍五入)

确切的信息是什么?

程序是立即“炸毁”还是在一段时间后(所以你可以使用 SHOW PROC/CONT)

是否有有效的源文件数据集(大小)?

干杯,海因。

于 2014-04-29T11:35:14.717 回答