-1

この質問は、バイナリ検索( + 5Mレコードテーブルに対する高速のメモリ内範囲ルックアップ)に関する以前の質問のフォローアップです。

以下の形式で、500万レコード/行を超えるシーケンシャルテキストファイルがあります。Range<int>[]配列にロードする必要があります。タイムリーにそれをどのように行うでしょうか?

ファイル形式:

start int64,end int64,result int
start int64,end int64,result int
start int64,end int64,result int
start int64,end int64,result int
...
4

2 に答える 2

0

私はあなたが良いディスクを持っていると仮定するつもりです。ファイルを1回スキャンして、エントリの数を数えます。ファイルに空白行がないことを保証できる場合は、ファイル内の改行の数を数えるだけで済みます。実際には各行を解析しないでください。

これで、正確にその数のエントリを使用して配列を1回割り当てることができます。これにより、アレイの過度の再割り当てが回避されます。

var numEntries = File.ReadLines(filepath).Count();
var result = new Range<int>[numEntries];

次に、ファイルをもう一度読み、次のようなコードで範囲オブジェクトを作成します。

var i = 0;
foreach (var line in File.ReadLines(filepath))
{
   var parts = line.Split(',');
   result[i++] = new Range<int>(long.Parse(parts[0]), long.Parse(parts[1]), int.Parse(parts[2]);
}

return result;

必要に応じて、エラー処理をいくつか振りかけます。このコードは理解しやすいです。ターゲット環境で試してみてください。遅すぎる場合は、最適化を開始できます。ただし、時期尚早に最適化することはしません。それは、必要とされない可能性のあるはるかに複雑なコードにつながるためです。

于 2013-03-07T17:21:49.400 に答える
0

これは典型的な(?)生産者/消費者問題であり、複数のスレッドを使用して解決できます。あなたの場合、プロデューサーはディスクからデータを読み取り、コンシューマーは行を解析して配列にデータを入力しています。私は2つの異なるケースを見ることができます:

  • プロデューサーはコンシューマーよりも(はるかに)高速です。この場合、より多くのコンシューマースレッドを使用してみてください。
  • コンシューマーはプロデューサーよりも(はるかに)高速です。より高速なハードディスクの購入やRAID 0の使用など、ハードウェア構成に影響を与える以外のことを高速化することはできません。この場合、私は複雑さを増す価値がないため、マルチスレッドソリューション。

この質問は、C#でそれを実装するのに役立つかもしれません。

于 2013-03-07T16:33:59.547 に答える