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)
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)
这个解决方案目前提供了良好的性能,但有两件事我不喜欢:
array因此我无法预先分配,因此我必须使用List<int>具有调整大小的潜在低效率的实际需要的两倍;任何想法都非常感谢.
使用List.Capacity手动增加容量,也许每1000行左右。
如果你想用性能换取内存,你可以这样做:不存储每行的位置,而只存储每 100(或其他)行的位置。然后,当需要第 253 行时,转到第 200 行的位置并向前计数 53 行。
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |