2

2つのファイルを読み取って処理するPerlスクリプトがあります。

最初のファイル-情報ファイル-ハッシュとして保存します(3.5 GB)

2番目のファイル(taregtファイル)は、情報ファイルおよび他のサブルーチンからの情報を設計どおりに使用して処理しています。(このファイル、ターゲット、範囲は30〜60 GB)

これまでの作業は次のとおりです。

  • 情報ファイルをハッシュに読み込む
  • ターゲットファイルをチャンクに分割する

すべてのチャンクで並行して実行したい:

while(chunks){
    # do something 

    sub a {}
    sub b {} 
} 

したがって、基本的には、チャンクを読み取り、その出力を書き込み、同時に複数のチャンクに対してこれを実行したいと思います。whileループは、チャンクファイルの各行を読み取り、処理のためにさまざまなサブルーチンを呼び出します。

バックグラウンドでチャンクを読み取る方法はありますか?

3.5GBの長さで、毎回3.5GBを占めるハッシュに読み込んでいるため、チャンクごとに情報ファイルを読みたくありません。

現在、スクリプトは30〜60GBで実行するのに1〜2時間かかります。

4

3 に答える 3

1

3.5GB のハッシュは非常に大きいため、代わりにデータベースの使用を検討する必要があります。これを行う方法によっては、ハッシュを介してデータベースにアクセスし続けることができます。

メモリが問題にならない場合は、forking が最も簡単な解決策になります。ただし、これにより、ハッシュを含むプロセスが複製され、不要なスワッピングが発生するだけです。

一部のメモリを解放できない場合は、 を検討する必要がありますuse threads。Perl スレッドはインタープリター内にのみ存在し、OS からは見えません。forkこれらのスレッドはing に似ていますが、変数を として宣言できます:shared。(する必要がありますuse threads::shared)

公式のPerl スレッド化チュートリアルを参照してください

于 2012-09-11T17:51:54.740 に答える
1

並列タスクが独立している場合は、Perlスレッドを試すことができます。

于 2012-09-11T17:50:17.953 に答える
1

モジュールFile::Map(メモリマッピング)については、大きなファイルを簡単に読み取ることができます。

use strict;
use File::Map qw(map_file);

map_file my $map, $ARGV[0]; # $ARGV[0] - path to your file
# Do something with $map
于 2012-09-11T18:40:41.743 に答える