perl - 在 Perl 中打开超过 10,000 个文件的问题

标签 perl file solaris ulimit

我需要在 Perl 脚本中打开 10,000 多个文件,因此我要求系统管理员将我的帐户限制更改为 14,000。 ulimit -a现在显示这些设置:

core file size        (blocks, -c) unlimited
data seg size         (kbytes, -d) unlimited
file size             (blocks, -f) unlimited
open files                    (-n) 14000
pipe size          (512 bytes, -p) 10
stack size            (kbytes, -s) 8192
cpu time             (seconds, -t) unlimited
max user processes            (-u) 29995
virtual memory        (kbytes, -v) unlimited

更改后,我运行了一个测试 Perl 程序,该程序在脚本末尾打开/创建 256 个文件并关闭 256 个文件句柄。当它创建 253 个文件时,程序会死掉,说打开的文件太多。我不明白为什么我会收到这个错误。

我正在 Solaris 10 平台上工作。这是我的代码
my @list;
my $filename = "test";

for ($i = 256; $i >= 0; $i--) {
    print "$i " . "\n";
    $filename = "test" . "$i";
    if (open my $in, ">", ${filename}) {
        push @list, $in;
        print $in $filename . "\n";
    }
    else {
        warn "Could not open file '$filename'. $!";
        die;
    }
}

for ($i = 256; $i >= 0; $i--) {
    my $retVal = pop @list;
    print $retVal . "\n";
    close($retVal);
}

最佳答案

According to this article这是 32 位 Solaris 的默认限制。程序通常仅限于使用前 256 个文件编号。 STDIN、STDOUT 和 STDERR 取 0、1 和 2,剩下 253。解决它不是一个简单的过程,ulimit 不会这样做,我不知道 Perl 是否会尊重它。

Here's a discussion about it on Perlmonks有一些建议的解决方法,例如 FileCache .

虽然 Solaris 的限制是不可原谅的,但通常有数百个打开的文件句柄表明您的程序可以设计得更好。

关于perl - 在 Perl 中打开超过 10,000 个文件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13409037/

相关文章:

Python - 比较文件中的字符串

linux - 索拉里 sftp : remove remote folder

c - Solaris 中的 get_random_bytes() 等效项

perl - 使用 Parse::RecDescent 解析带有嵌套括号的字符串

c++ - C++ 中的文件 Glob

perl - Perl 中的 boolean 函数应该返回什么值?

java - 如何获取从图库中选择的图像的目录和文件名

c++ - 加载大型文本文件(50,000 多行,~8MB)会导致我的程序停止?

solaris - 如何在 Solaris、HP-UX 和 AIX 中查找共享内存限制和信号量限制?

excel - 我可以使用 perl 创建数据透视表吗?