阅读大文件c#部分的最佳方法

时间:2014-01-06 11:40:22

标签: c# text mono filestream streamreader

我使用.Net 2.0 mono进行Unity3d部署到手持设备和桌面。 我必须在启动时解析大型txt文件(目前使用StreamReader)。这些甚至可以达到100 / 200MB或更多。将它们读入线阵列在桌面上很好,但在手持设备上则不行。我需要保留对某些行的引用,以便能够检索文件的块。

通过行迭代查找字符串在ipad上的10MB文件上占用一秒钟,将1个10MB文件读入行阵列需要3秒左右。

是否可以保存某行开始的字节,以便我可以使用FileStream并相应地设置位置或者我如何做到这一点的任何其他建议?

也许回答我自己的问题..我应该创建自己的FileStream,读取字节并解析查找eol字符?

编辑:我的搜索代码找到一个字符串......

System.IO.StreamReader file = new System.IO.StreamReader(filePath));
string line;
while((line = file.ReadLine()) != null) {
    if (line[0] != 'g')
        continue;

    if (line.Contains(searchString)) {
        debugString = (Time.realtimeSinceStartup - temp).ToString();
        Debug.Log (Time.realtimeSinceStartup);
        break;
    }           
}

1 个答案:

答案 0 :(得分:3)

你绝对应该阅读why GNU grep is fast。你应该知道Boyer-Moore string search algorithm

避免CPU是等式的一部分,Boyer-Moore和其他类似的算法是关键(避免查看每个字符,避免触及每个内存位置)。另一个关键组件是优化IO,但这在很大程度上取决于底层硬件。 HDD系统就像顺序读取(没有磁头移动),但这一点在移动系统上没有实际意义。在你的情况下,我猜想优化搜索是关键。标记线可能是无关紧要的,更好的解决方案是在匹配的左侧和右侧找到行分隔符,因为统计上的行通常比文件短得多,并且您可能不希望每行都匹配。阅读第一个链接。

执行内存映射IO而不是流式IO也可能会产生改进,但是对mmap的Mono支持是粗略的(请参阅System.IO.MemoryMappedFiles on MonoTouch?)。使用mmap编写算法并不是一件容易的事情(你需要了解内存,指针等),但即使使用C#也是如此。