我正在处理一个需要从一系列可能很大的文本文件(~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
// maps each line to it's corresponding fileStream.position in the file
List<int> _lineNumberToFileStreamPositionMapping = new List<int>();
增量new line
并将lineCount
添加到fileStream.Position
然后我们使用类似于:
的API_lineNumberToFileStreamPositionMapping
此解决方案目前提供了良好的性能,但有两件事我不喜欢:
public void ReadLine(int lineNumber)
{
var getStreamPosition = _lineNumberToFileStreamPositionMapping[lineNumber];
//... set the stream position, read the byte array, convert to string etc.
}
因此我必须使用array
,这可能会导致调整大小的效率低于实际值的两倍需要; 非常感谢任何想法。
答案 0 :(得分:3)
使用List.Capacity手动增加容量,可能每1000行左右。
如果你想换取内存的性能,你可以这样做:不是存储每一行的位置,而是只存储每100行(或某物)行的位置。然后,当需要第253行时,转到第200行的位置并向前计数53行。