如何有效地索引文件?

时间:2016-04-12 23:44:07

标签: c# .net indexing filestream

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

线条的长度可以不同。

为了减少GC并创建不必要的字符串,我使用在Is there a better way to determine the number of lines in a large txt file(1-2 GB)?提供的解决方案来检测每个新行并将其存储在一个映射中,从而生成{ {1}},即:

lineNo => position
  1. 浏览整个文件
  2. 检测到// maps each line to it's corresponding fileStream.position in the file List<int> _lineNumberToFileStreamPositionMapping = new List<int>(); 增量new line并将lineCount添加到fileStream.Position
  3. 然后我们使用类似于:

    的API
    _lineNumberToFileStreamPositionMapping

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

    1. 由于我不知道文件中的总行数,因此我无法预先分配public void ReadLine(int lineNumber) { var getStreamPosition = _lineNumberToFileStreamPositionMapping[lineNumber]; //... set the stream position, read the byte array, convert to string etc. } 因此我必须使用array,这可能会导致调整大小的效率低于实际值的两倍需要;
    2. 内存使用情况,所以作为一个约1GB的文本文件的例子,索引占用约150万行〜150MB,我真的希望尽可能减少这个。
    3. 非常感谢任何想法。

1 个答案:

答案 0 :(得分:3)

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

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