【问题标题】:Maximum number of file handles that can be opened in PerlPerl 中可以打开的文件句柄的最大数量
【发布时间】:2018-03-31 00:02:04
【问题描述】:

我正在编写一个 Perl 脚本,该脚本会打开一个巨大的文件,其中包含以下格式的记录。脚本可能在 Solaris 10 或 HP UX 11.0 中运行

Filename1 , col1, col2
Filename1 , col1, col2
Filename2 , col1, col2
Filename3 , col1, col2

当我读取输入文件的第一个字段文件名时,如果它不存在,我需要创建一个新文件并将其余字段打印到文件中。输入文件中可能有 13000 个唯一文件名。我可以在 Solaris 10 或 hpux 11 中打开的最大文件句柄数是多少?我能打开 13000 个文件句柄吗?我打算使用哈希来存储文件句柄,以便将其写入文件并关闭它。另外,如何轻松地从整个文件的第一个字段中获取唯一的文件名?有没有一种简单的方法来做到这一点,而不是读取文件的每一行?

【问题讨论】:

  • 系统允许打开的数量。

标签: perl hp-ux solaris-10


【解决方案1】:

文件句柄的最大数量取决于操作系统(并且是可配置的)

ulimit (manual page is here)

但是打开那么多文件句柄是不合理的。重新考虑您的算法。

【讨论】:

  • 非常感谢您提供的信息。我如何检查硬限制。我在 solaris 10 中找不到 /etc/security/limits.conf 文件。solaris10 中没有 system.conf。不确定配置文件在哪里。
【解决方案2】:

不,如果不读取整个文件,就无法获取所有唯一文件名。但是您可以在处理文件时生成此列表。当您读取一行时,将文件名添加为哈希的键。最后,打印散列的键。

【讨论】:

    【解决方案3】:

    我不知道您的系统允许什么,但您可以使用FileCache 模块打开比系统允许更多的文件句柄。这是一个核心 Perl 模块,因此您甚至不需要安装它。

    如果不读取整个文件,就无法从文本文件中取出第一列,因为文本文件实际上没有列甚至行的内部结构;它们只是一长串数据。找到每个“行”的唯一方法是遍历整个文件并查找换行符。

    然而,即使是巨大的文件,Perl 通常也能很快处理。这不太可能成为问题。这是获取唯一文件名的简单代码(假设您的文件以 FILE 形式打开):

    my %files;
    while (<FILE>) { /^(\S+)/ and $files{$1}++; }
    

    最后计算每个文件出现的次数。它假定您的文件名不包含任何空格。我用超过 30,000 行对此进行了快速测试,它是瞬间完成的。

    【讨论】:

    • 我读了 ulimit 命令,它说你不能越过硬限制。只有 root 用户可以更改它。 FileCache 模块是否设置了软限制?它是否比通常打开和关闭文件的方式更快?在您粘贴的代码中,在常规表达式中进行一个或多个空格检查并添加到哈希图中的目的是什么。该文件是一个 csv 文件,我只需要第一个字段。
    猜你喜欢
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多