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

ファイルハンドルの最大数は OS によって異なります (設定可能です)。

参照ulimitマニュアルページはこちら

ただし、多くのファイル ハンドルを開くのは不合理です。アルゴリズムを再考してください。

于 2012-10-18T06:49:34.350 に答える
1

システムで何が許可されているかはわかりませんが、このFileCacheモジュールを使用すると、システムで許可されているよりも多くのファイル ハンドルを開くことができます。これは Perl のコア モジュールであるため、インストールする必要さえありません。

ファイル全体を読み取らずに、テキスト ファイルから最初の列を取得する方法はありません。テキスト ファイルには列や行の内部構造が実際には存在しないためです。それらは単なる 1 つの長いデータ文字列です。各「行」を見つける唯一の方法は、ファイル全体を調べて改行文字を探すことです。

ただし、巨大なファイルでさえ、通常、Perl では非常に高速に処理されます。これが問題になることはほとんどありません。一意のファイル名を取得するための簡単なコードを次に示します (ファイルが FILE として開かれていると仮定します)。

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

これにより、各ファイルが発生した回数がカウントされます。ファイル名にスペースが含まれていないことを前提としています。これを 30,000 行以上で簡単にテストしたところ、瞬時に実行されました。

于 2012-10-18T07:48:10.130 に答える
1

いいえ、ファイル全体を読み取らずに一意のファイル名をすべて取得する方法はありません。ただし、ファイルの処理中にこのリストを生成できます。行を読み取るときは、ファイル名をハッシュのキーとして追加します。最後に、ハッシュのキーを出力します。

于 2012-10-18T06:52:55.633 に答える