如何有效地索引文件?

MaY*_*YaN 6 .net c# indexing filestream

我正在处理一个需要从一系列可能很大的文本文件(~3 + GB)中随机读取整行文本的应用程序.

线条可以具有不同的长度.

为了减少GC和创建不必要的字符串,我使用的解决方案是:有更好的方法来确定大型txt文件(1-2 GB)中的行数吗?检测每个新行并将其存储在一个映射中,从而产生一个索引lineNo => position:

// maps each line to it's corresponding fileStream.position in the file    
List<int> _lineNumberToFileStreamPositionMapping = new List<int>();
Run Code Online (Sandbox Code Playgroud)
  1. 浏览整个文件
  2. 当检测到一个new line增量lineCount并添加fileStream.Position_lineNumberToFileStreamPositionMapping

然后我们使用类似于以下的API:

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

这个解决方案目前提供了良好的性能,但有两件事我不喜欢:

  1. 由于我不知道文件中的总行数,array因此我无法预先分配,因此我必须使用List<int>具有调整大小的潜在低效率的实际需要的两倍;
  2. 内存使用情况,所以作为一个文本文件的例子~~ 1GB,文本约500万行,索引占用~150MB我真的希望尽可能减少这个.

任何想法都非常感谢.

sme*_*ead 4

  1. 使用List.Capacity手动增加容量,也许每1000行左右。

  2. 如果你想用性能换取内存,你可以这样做:不存储每行的位置,而只存储每 100(或其他)行的位置。然后,当需要第 253 行时,转到第 200 行的位置并向前计数 53 行。