可以在Perl中打开的最大文件句柄数

时间:2012-10-18 06:43:48

标签: perl hp-ux solaris-10

我正在开发一个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个文件句柄吗?我打算使用哈希来存储文件句柄,以便将其写入文件并关闭它。另外,如何从整个文件的第一个字段轻松获取唯一文件名?有没有一种简单的方法可以做到而不是阅读文件的每一行?

3 个答案:

答案 0 :(得分:2)

文件句柄的最大数量是OS依赖(并且是可配置的)

请参阅ulimitmanual page is here

然而,打开许多文件句柄是不合理的。重新考虑一下你的算法。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

然而,Perl通常会很快处理大型文件。这不太可能是个问题。以下是获取唯一文件名的简单代码(假设您的文件以FILE方式打开):

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

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