当我注意到我的脚本在将内容写入文件的while循环中开始暂停时,会出现这个问题。我首先检查一下我的记忆,看看当我的RAM下降到2-3%时会发生这种情况。然后我寻找消耗RAM的代码块,并认为当脚本继续向文件提供内容时,它的大小也会增加,这也会占用内存。 以下是执行文件创建的代码:
open (my $fh, '>>', $filePath);
while (my $row = $sth->fetchrow_hashref) {
print $fh join ('|', $row->{name}, $row->{address}) "\n";
}
如果我取消注释print语句并运行脚本,我的RAM将不会减少。所以,我非常确定我的内存RAM是由FILEHANDLE / Perl背后的其他内容占用了内存。这引出了一个问题,是否有办法将文件从Perl脚本写入磁盘,而不是使用内存RAM?
free
来检查我的记忆。答案 0 :(得分:7)
所以问题的答案"为什么Perl会在打印文件时占用我的RAM?"是Perl没有使用内存。操作系统的文件缓存正在使用内存。
你的Perl脚本写了一个大文件。它首先进入RAM中的文件缓存,操作系统在有时间或RAM耗尽时将其写入磁盘。它不会从RAM中删除它,除非你删除文件或者需要RAM来处理别的东西。
文件缓存并不是一件坏事,你不应该担心它有多少使用你的RAM。当程序需要更多内存时,操作系统可以非常快速地清除文件缓存并为程序重用内存。
答案 1 :(得分:5)
将文件句柄的缓冲区刷新到磁盘不会释放缓冲区,因此它不会释放任何内存。释放缓冲区是浪费的,因为下次程序写入文件时需要重新分配缓冲区。
如果您想知道,每个文件句柄都有4 KiB或8 KiB缓冲区,具体取决于您的Perl版本。