4

私は非常に大きなファイルのコレクションを持っています。私の仕事は、このコレクションからいくつかのランダムなファイルを開き、それらのコンテンツを整数の​​セットとして扱い、それを交差させることです。

このプロセスは、ディスクからメモリにファイルを読み取る時間が長いため非常に遅いため、プログラムを「クイック」言語で書き直すことで、このファイルからの読み取りプロセスを高速化できるかどうか疑問に思っています。現在、私はこの種の仕事には非効率的なPythonを使用しています。(python と javascript 以外の言語を知っていれば、自分でテストを実装できます...)

また、すべての日付をデータベースに入れることは役に立ちますか? とにかくファイルはRAMに収まらないため、データベース関連のオーバーヘッドのみでディスクから再度読み取られます。

ファイルの内容は長整数のリストです。ファイルの 90% は非常に小さく、10 ~ 20MB 未満ですが、残りの 10% は約 100 ~ 200MB です。入力としてファイル名があり、各ファイルを読み取り、指定されたすべてのファイルに存在する整数を出力する必要があります。このデータをmongodbに入れようとしましたが、mongoインデックス機能を使用しようとしたが、mongoはインデックスをRAMに保存しないため、プレーンファイルベースのアプローチと同じくらい遅くなりました。現在、最大のファイルの 10% を切り取り、残りを redis に保存し、時々それらの大きなファイルにアクセスしています。これは明らかに一時的な解決策です。これは、データが大きくなり、使用可能な RAM の量が増えないためです。

4

2 に答える 2

1

ファイルに重複した番号が含まれていない場合は、次のようにします。

sort file1 file2 | uniq -d

重複が含まれている可能性がある場合は、最初に重複を排除する必要があります。

sort -u file1 > /tmp/file1
sort -u file2 > /tmp/file2
cat /tmp/file1 /tmp/file2 | sort | uniq -d

または、(明示的に) 一時ファイルを使用しないバージョンを好む場合。

(sort -u file1; sort -u file2) | sort | uniq -d

ファイルの形式については言及していません (上記では、1 行に 1 つの整数を含むテキストを想定しています)。それらが何らかのバイナリ形式である場合、上記のコマンドを適用する前にそれらを変換するコマンドも必要になります。パイプを使用すると、このステップを次のように構成できます。

(decode file1 | sort -u ; decode file2 | sort -u) | sort | uniq -d

decodeファイル形式を解析するために作成する必要があるプログラムの名前を次に示します。

このシェル ソリューションの優れている点は、信じられないほど短くてシンプルであることに加えて、RAM に収まらないサイズのファイルでも機能することです。

あなたの質問からは、交差するファイルが2つまたは任意の数であるかどうかは明確ではありません(質問の最初は「カップル」、最後は「ファイル名のリスト」と言います)。たとえば、2 つではなく 5 つのファイルを処理するには、uniq -c | awk '{ if ($1=="5") print $2; }'代わりに次のように使用します。uniq -d

于 2012-08-04T08:39:24.520 に答える