繁体   English   中英

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

[英]Best way to read section of large file c#

我使用.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;
    }           
}

你应该完全理解为什么GNU grep很快 你应该知道Boyer-Moore字符串搜索算法

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM