8

2 つの異なるファイルを組み合わせてデータを処理する必要があります。どちらにも、並べて照合するために使用できる主キーを形成する 2 つの列があります。問題のファイルは巨大 (2,000 万行で約 5GB) であるため、効率的なコードが必要です。Perlでこれを行うにはどうすればよいですか?

例を挙げます:

ファイル A に列が含まれている場合

id, name, lastname, dob, school

ファイル B には列が含まれています

address, id, postcode, dob, email

列を持つ出力ファイルを作成するには、2 つのファイルのiddobを一致させて、これら 2 つのファイルを結合する必要があります。

 id, name, lastname, dob, school, address, postcode, email
4

6 に答える 6

7

新しいmysql/sqlite/whatever DBを作成して行を挿入するだけだと思います。~20 行の perl である必要があります。

もちろん、これにはDBへの簡単なアクセスが必要です..

興味深いフィールドでファイルを並べ替えてから、file1 の各行について、file2 の一致する行を見つけて出力することもできると思います。

于 2012-01-03T12:53:32.110 に答える
2

これを行う昔ながらの方法は、システム ユーティリティを使用して両方のファイルをキー シーケンスでソートし、行ごとに一致させることです。キーが一致する場合は両方のファイルを読み取り、データを出力します。一致しない場合は、一致するまで小さい方のキーでファイルを読み取ります。ファイルが eof に達した場合、ファイルのキーを無限に高く設定します。両方のキーが無限に高くなったら、完了です。

于 2012-01-03T17:09:14.340 に答える
0

私は実際にこれを試したことはありませんが、より創造的な解決策は次のとおりです。

  1. 各ファイルを 1 回読み取り、一意の id+dob の組み合わせとファイル内のそれらの位置の間のマップを作成します。tell()を使用します。
  2. perl でマップを作成する
  3. マップ内の位置とsysread()を使用して、ファイルから実際のデータを読み取ります。
  4. データを新しいファイルに書き込む
于 2012-01-04T10:54:48.063 に答える
0

このようなことを行うように設計された私の 3 年前の CPAN モジュール Set::Relation を使用して、Perl での結合などのすべての SQL 機能を実行することもできます。ファイルごとに Set::Relation オブジェクトを作成し、join() メソッドを使用します。とはいえ、実装されたこのモジュールはすべてのオペランドを保持し、結果としてメモリになるため、RAM によって制限されます。ただし、 join() がどのように機能するかについてそのソースを確認し、それに基づいて目的に合ったより効率的なバージョンを実装することはできます。

于 2012-01-09T06:10:01.320 に答える
0

また、 DBD::AnyDataを試すこともできます

于 2012-01-09T12:41:55.267 に答える
0

または、この素晴らしいTechrepublic の記事を熟読してください - それでも 5G のメモリが必要になる可能性があります. unix/linux CLI の sort/join ユーティリティを使用すると、効率的にどこに行くことができるのだろうか。ちょっとした考え。

于 2012-01-03T16:29:54.133 に答える