0

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

4

3 回答 3

2

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

ulimit手册页在这里

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

于 2012-10-18T06:49:34.350 回答
1

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

于 2012-10-18T06:52:55.633 回答
1

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

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

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

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

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

于 2012-10-18T07:48:10.130 回答