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

C# 读取大文件c部分的最佳方法#,c#,text,mono,filestream,streamreader,C#,Text,Mono,Filestream,Streamreader,我正在使用.Net 2.0 mono for Unity3d部署到手持设备和桌面。 我必须在启动时解析大型txt文件(目前使用StreamReader)。这些加起来可能高达100/200MB甚至更多。在桌面上将它们读入线阵列是可以的,但在手持设备上则不行。我需要保留对某些行的引用,以便能够检索文件的块 在ipad上的10MB文件上,通过行迭代查找字符串需要一秒钟的时间,而将1个10MB文件读入行数组需要3秒钟左右 是否可以保存某行开始的字节,以便我可以使用文件流并相应地设置位置,或者对如何执行此

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

在ipad上的10MB文件上,通过行迭代查找字符串需要一秒钟的时间,而将1个10MB文件读入行数组需要3秒钟左右

是否可以保存某行开始的字节,以便我可以使用文件流并相应地设置位置,或者对如何执行此操作提出任何其他建议

也许能回答我自己的问题。。我应该创建自己的文件流,读取字节并进行解析以查找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;
    }           
}

你绝对应该读书。你应该知道

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


使用内存映射IO而不是流式IO也可能会带来改进,但对mmap的Mono支持还很粗略(请参阅)。根据mmap编写算法并非易事(您需要了解内存、指针等),但即使使用C#,也有可能做到这一点。

速度的限制因素是读取时间+处理时间。从本地驱动器读取时间应假定为常数。你能并行处理吗?你能控制文件格式吗?可能需要为文件编制索引。它们是wavefront.obj文件。在它们到达客户端应用程序之前,我在php web服务中对它们做了一些工作,因此可能会对它们做一些事情。。索引是什么意思?索引一个文件就像索引一本书一样。在顶部放一个内容部分,标记所有感兴趣的位置,这样你就可以直接跳过你想要的部分。如果你必须阅读整个文件,那么恐怕你会被困在等待中。10MB听起来很大,但不是太大。你有任何控制台输出,可能会使它看起来很慢吗?我想我可以限制读取时间,如果我从一个特定的字节读取。。。还是必须先读取整个文件才能从某个字节访问?我在上面添加了我的搜索代码。我在一个发布版本上测试了这一点,在iPad2上没有过多的调试代码,这将超过我必须部署到的其他设备