2016-04-12 7 views
6

私は一連の潜在的に大きなテキストファイル(〜3 + GB)からテキストの行全体をランダムに読み込む必要があるアプリケーションを扱っています。ファイルを効率的にインデックスできますか?

ラインは、異なる長さのものとすることができます。

GCを削減し、不要な文字列を作成するために、私はで提供される解決策使用しています:それぞれの新しい行を検出するため、lineNo => positionすなわちのインデックスを生成する1回のパスでマップにそれを格納するIs there a better way to determine the number of lines in a large txt file(1-2 GB)?を:

// maps each line to it's corresponding fileStream.position in the file  
List<int> _lineNumberToFileStreamPositionMapping = new List<int>(); 
new lineインクリメント lineCountを検出し、 _lineNumberToFileStreamPositionMappingfileStream.Positionを追加するとき
  1. ファイル全体を経ます

    1. を私は知らないので:しかし、私は好きではない二つのものがある

      public void ReadLine(int lineNumber) 
      { 
          var getStreamPosition = _lineNumberToFileStreamPositionMapping[lineNumber]; 
          //... set the stream position, read the byte array, convert to string etc. 
      } 
      

      このソリューションは現在、良好なパフォーマンスを提供している:私たちは、その後に似たAPIを使用する

    ファイル内の行の合計数が、私は私が実際に必要なものの二倍にリサイズの潜在的な非効率性を持っているList<int>を使用する必要がありますのでarrayを事前に割り当てることができません。

  2. メモリ使用量、インデックスが占有しているテキストの約5万行を持つ〜1ギガバイトのテキストファイル〜150メガバイトのための一例として、私は本当に可能な限り、この限り減少したいと思いますので。

任意のアイデアは非常に高く評価されています。

+0

なぜインデックス150ギガバイトはありますか? 5百万の整数が20MBの未使用ストレージの下にあるので、その価値はどこにありますか? – DavidG

+0

これはプロファイラーが私に示していることですが、もう一度私は深く掘り下げませんでした。さて、20MBは理想的なシナリオでしょうが、実際には 'List'のサイズ変更ロジックのために2倍になる可能性があります – MaYaN

+0

おそらくあなたは普通の古い配列を使うべきです。 'List'が実際に役に立つものをあなたに与えるかどうかは分かりません。リストを作成したら、配列に変換してリストを投げてください。 – DavidG

答えて

3
  1. List.Capacityを使用すると、手動で容量を増やすことができます。おそらく1000行程度です。

  2. メモリのパフォーマンスを交換したい場合は、これを行うことができます。すべての行の位置を保存する代わりに、100番目(または何か)の行の位置のみを保存します。次に、たとえば253行目が必要な場合は、200行目の位置に移動し、53行目を数えます。

+1

aaaah ...とてもいいです!私はこれが試してみるのがとても好きです。 tnx! – MaYaN

関連する問題