私は約4億行と3列のファイルを扱っています。最初の2つの列は英数字の文字列で、最後は数値です。このようなもの:連想配列:PythonとPerlとAwk Performaceとの比較
NM_001011874.1,NM_011441.4,-0.131672299779153
私はほぼ同じ数の行と3つの列を持つ複数のファイルがあります。これらは必ずしも3つの列のいずれかに基づいてソートされるとは限りません。私は最初の2つの列の組み合わせに基づいてこれらのファイルを結合しようとしています。例えば:私は何をしようとしている
File 1
NM_001011874.1,XR_104537.1,-0.929524370261122
NM_001011874.1,XM_003084433.1,-0.603098764428879
File 2
NM_001011874.1,XR_104537.1,-0.11254525414
NM_001011874.1,NM_005040.1,-0.20509876488
File 3
NM_001011874.1,XR_104537.1,-0.41254525414
NM_001011874.1,NM_005040.1,-0.60509876488
は、最初の2つの列の値の組み合わせを使用し、そのペアの3番目の列から対応する値を取得することにより、キーを作成することです。私が手に最終的な出力は次のようになります。
Output2
NM_001011874.1,XR_104537.1,-0.11254525414,-0.929524370261122,-0.41254525414
NM_001011874.1,NM_005040.1,-0.20509876488,,-0.60509876488
私は上記を行うためにはawkを使用しています:
awk -F',' 'NR==FNR{a[$1,$2]=$3;next}{$4=a[$1,$2];print}' OFS=',' file1.txt file2.txt
は私が仕事のために256ギガバイトを割り当てています。各ファイルの行数が4億〜3列の2つのファイルを組み合わせて出力を生成するには、上記のコマンドを使用すると約90分かかります。出力ファイルには、400億行がありますが、4列あります。追加される列ごとに、出力ファイルを生成するためにかかる時間が長くなります。
私はこれを順番に実行しています。つまり、file1とfile2をマージして、4つの列を持つoutput1を生成します。次に、file3とoutput1をマージして5列のoutput2を作成し、file4とoutput2を作成して6列のoutput3を生成します。最後の出力が22列になるまで続きます。
PythonやPerlでこれを行うのがスピードと自動化の面で効率的かどうか疑問に思っていますか?私は3列のファイルを20個ほど持っていますが、行は1億〜4億までさまざまです。 PythonやPerlでこれを行う方が良いと思うなら、awkスクリプトがどのようにPythonやPerlに変換されるかを説明する例を挙げてください。
編集: コメント3に加えて、最終的な出力はコメントに基づいています。
パンダやナンシーのような感じです。 – TigerhawkT3
もちろん、あらゆる目的のためにスクリプトを用意する方がよいでしょう。なぜあなたはそれを書いていないのですか?私はまっすぐなPerlスクリプトでは2桁も速くなると思っています。 – zdim
@zdimなぜあなたはawkよりも速いと思いますか? gkandoi '$ 4 = a [$ 1、$ 2]; print'を実行し、awkに' print $ 0、a [$ 1、$ 2] 'の代わりに$ 0を再コンパイルするように強制する点は何ですか? –