日期:2014-05-16  浏览次数:21026 次

读取文本的效率
目前有两个文本(文本最大1000行左右),A.TXT和B.TXT, A中的第一列和B中的第一列是关联字段。
问题:
1.我现在是用File.ReadAllText方法把文本读取放在string字符串里,然后split存放在string数组中,这个读取步骤是否有提升效率的空间呢?
2.我将存放A.TXT和B.TXT的两个字符串数组进行关联,用的是for循环进行id关联匹配的,将关联完成的结果放入字符串数组中。这里的用for进行关联是否有提升的空间呢?(我是想把两个文本内容分别存入datatable,用datatable来进行关联,不知道能不能提供速度?)
3.用for循环进行删选内容快?还是将文本转成datatable后用select来删选快呢?

请有经验的高手指点一下,多谢!
------解决方案--------------------
(1)File.ReadAllLines更快。
(2)用linq的join代替两层循环效率更高。
(3)用linq的where过滤。
------解决方案--------------------
(1)File.ReadAllLines,再Split,你的效率不会高。
     建议使用StreamReader.ReadLine,尤其是当文件越来越大的时候,
     如果已经大到一个量级,比如说10M甚至更大的时候,那就你该考虑使用MemoryMappedFile了,几个小文件也属实用不到。
(2)如果你是来追求效率的,那就不要使用Linq了,string[] result = arr1.Join(arr2, x => x.Split(',')[0], x => x.Split(',')[0], (x, y) => x + "," + y).ToArray(); 看着这一串Split,就知道你的内存和CPU降不下来。
     建议你使用Dictionary<T1, HashSet<T2>>结构进行数据处理,T1为你A,B文件的第一列数据类型,能转数值型,就不要使用字符串。T2就是所谓的除了第一列以外的数据类型了,也不知道你那都是什么玩艺,反正无所谓了。
(3)筛选效率的高低,不在于你用的是for还是datatable的select.还是要看你的数据结构还是比较算法。
     当然,通常情况是,能适用foreach,就不要使用for了。已经标好索引的遍历要比你根据索引查找稍好一点。

     虽然与你的问题关系不大,还是建议你花个两三分钟看一眼这里:http://user.qzone.qq.com/28076333/blog/1394391869,如果你真对性能感兴趣的话。
     Linq我用的不多,但至少我碰到了一个要命的问题,就是在数据量大的时候,做Distinct,很慢很慢,CPU耗尽,内存吃掉一半,而且居然还是会有重复数据。大数据量处理,建议不要使用Linq。