そのため、奇妙な理由で、100 GBのログファイルが並べ替えられていない(実際には部分的に並べ替えられている)ことになりますが、適用しようとしているアルゴリズムには並べ替えられたデータが必要です。ログファイルの行は次のようになります
data <date> data data more data
ワークステーションでC#4.0と約4GBのRAMにアクセスできます。ここではマージソートが最適だと思いますが、これらのアルゴリズムを自分で実装することはできません。私が取ることができるショートカットがあるかどうかを尋ねたいと思います。
ちなみに、日付文字列の解析DateTime.Parse()
は非常に遅く、多くのCPU時間を消費します-チャギングレートはわずか10MB/秒です。以下よりも速い方法はありますか?
public static DateTime Parse(string data)
{
int year, month, day;
int.TryParse(data.Substring(0, 4), out year);
int.TryParse(data.Substring(5, 2), out month);
int.TryParse(data.Substring(8, 2), out day);
return new DateTime(year, month, day);
}
私はスピードアップするためにそれを書きましたDateTime.Parse()
、そしてそれは実際にうまくいきます、しかしそれでもバケツの負荷のサイクルを取っています。
現在のログファイルについては、時間、分、秒にも関心があることに注意してください。DateTime.Parse()にフォーマットを提供できることは知っていますが、それほど高速化されていないようです。
よろしくお願いします。
編集:日付を比較するために文字列比較を使用することを提案する人もいます。これは並べ替えフェーズでは機能しますが、アルゴリズムの日付を解析する必要があります。手動で行わずに、4GBの無料RAMで100GBのファイルを並べ替える方法がまだわかりません。
編集2 :ええと、私がWindowsソートを使用するといういくつかの提案のおかげで、Linux用の同様のツールがあることがわかりました。基本的に、sortを呼び出すと、すべてが修正されます。私たちが話すとき、それは何かをしている、そして私はそれがすぐに終わることを願っている。私が使用しているコマンドは
sort -k 2b 2008.log > 2008.sorted.log
-kは、通常の形式の日時文字列である2番目の行でソートすることを指定しYYYY-MM-DD hh:mm:ss.msek
ます。マンページにはすべてのオプションの説明が不足していることを認めなければなりませんが、を実行して多くの例を見つけましたinfo coreutils 'sort invocation'
。
結果とタイミングを報告します。ログのこの部分は約27GBです。2009年と2010年を別々に並べ替えてから、sort-mオプションを使用して結果を1つのファイルにマージすることを考えています。
編集3ええと、iotopをチェックすると、データファイルの小さなチャンクを読み込んで、それらを処理するために猛烈に何かをしていることがわかります。このプロセスはかなり遅いようです。=(
sort
はメモリを使用せず、単一のコアのみを使用しています。ドライブからデータを読み取る場合、何も処理していません。私は何か間違ったことをしていますか?
編集43時間経っても、同じことを続けています。今、私は関数のパラメーターを試してみたい段階にありますが、3時間投資しています...約4時間で中止し、よりスマートなメモリを使用して一晩計算するようにしますおよびスペースパラメータ...
編集5家に帰る前に、次のコマンドでプロセスを再開しました。
sort -k 2b --buffer-size=60% -T ~/temp/ -T "/media/My Passport" 2010.log -o 2010.sorted.log
今朝、これを返しました:
sort: write failed: /media/My Passport/sortQAUKdT: File too large
Wraawr!このプロセスをスピードアップするために、できるだけ多くのハードドライブを追加するだけだと思いました。どうやらUSBドライブを追加することはこれまでで最悪のアイデアでした。現時点では、FAT / NTFSなどの問題であるかどうかさえわかりません。これは、fdiskがUSBドライブが「間違ったデバイス」であると言っているためです...冗談ではありません。後でもう一度試してみます。とりあえず、このプロジェクトを失敗した可能性のある山に入れましょう。
最終通知 今回は、上記と同じコマンドで動作しましたが、問題のある外付けハードドライブはありませんでした。よろしくお願いします!
ベンチマーク
同じSATAコントローラーで2つのワークステーショングレード(少なくとも70mb /秒の読み取り/書き込みIO)のハードディスクを使用すると、30GBのログファイルを並べ替えるのに162分かかりました。今夜、さらに52 GBのファイルを並べ替える必要があります。その方法については、投稿します。