私は一連の潜在的に大きなテキストファイル(〜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
を検出し、
_lineNumberToFileStreamPositionMapping
に
fileStream.Position
を追加するとき
- は
- ファイル全体を経ます
- を私は知らないので:しかし、私は好きではない二つのものがある
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
を事前に割り当てることができません。 - を私は知らないので:しかし、私は好きではない二つのものがある
- メモリ使用量、インデックスが占有しているテキストの約5万行を持つ〜1ギガバイトのテキストファイル〜150メガバイトのための一例として、私は本当に可能な限り、この限り減少したいと思いますので。
任意のアイデアは非常に高く評価されています。
なぜインデックス150ギガバイトはありますか? 5百万の整数が20MBの未使用ストレージの下にあるので、その価値はどこにありますか? – DavidG
これはプロファイラーが私に示していることですが、もう一度私は深く掘り下げませんでした。さて、20MBは理想的なシナリオでしょうが、実際には 'List'のサイズ変更ロジックのために2倍になる可能性があります – MaYaN
おそらくあなたは普通の古い配列を使うべきです。 'List'が実際に役に立つものをあなたに与えるかどうかは分かりません。リストを作成したら、配列に変換してリストを投げてください。 – DavidG