读取文本的效率

JS 2014-03-08 11:05:03
目前有两个文本(文本最大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来删选快呢?

请有经验的高手指点一下,多谢!
...全文
431 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
JS 2014-04-29
  • 打赏
  • 举报
回复
最终还是将数据发布到iis上来做的,频繁开打文件对cpu消耗太大了。
JS 2014-03-16
  • 打赏
  • 举报
回复
谢谢各位(特别是devmiao,谢谢你的耐心解答),最终是利用datatable来做的,速度还行就是cpu有一定消耗。
JS 2014-03-12
  • 打赏
  • 举报
回复
引用 16 楼 wj9900 的回复:
1000条数据量不算大,用streamreader逐行读取,再写入数据库中,做任何增删查改操作效率都很高。
没有数据库
wj9900 2014-03-12
  • 打赏
  • 举报
回复
1000条数据量不算大,用streamreader逐行读取,再写入数据库中,做任何增删查改操作效率都很高。
MikeCheers 2014-03-12
  • 打赏
  • 举报
回复
(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。
devmiao 2014-03-12
  • 打赏
  • 举报
回复
用GroupJoin http://gaojianzhuang110.blog.163.com/blog/static/186131462011410102529286/
JS 2014-03-11
  • 打赏
  • 举报
回复
引用 6 楼 devmiao 的回复:
[quote=引用 5 楼 CJavaer 的回复:] [quote=引用 4 楼 devmiao 的回复:] [quote=引用 3 楼 CJavaer 的回复:] [quote=引用 1 楼 devmiao 的回复:] (1)File.ReadAllLines更快。 (2)用linq的join代替两层循环效率更高。 (3)用linq的where过滤。
谢谢你的回答,如果用linq的话,我是一定要把读取的文本转成datatable,然后再用linq来操作吧?[/quote] 不需要,Linq可以直接操作数组。[/quote] 哦,通过linq做关联操作比通过datatable做关联的效率要高是么?[/quote] 主要是join通过比较key的hash来关联,你自己也可以写出相同算法复杂度的程序(logN),但是双重循环肯定效率很低(N^2)[/quote] 两个文本文件,最大不超过1w条记录,读出放在数组中的
JS 2014-03-11
  • 打赏
  • 举报
回复
引用 6 楼 devmiao 的回复:
[quote=引用 5 楼 CJavaer 的回复:] [quote=引用 4 楼 devmiao 的回复:] [quote=引用 3 楼 CJavaer 的回复:] [quote=引用 1 楼 devmiao 的回复:] (1)File.ReadAllLines更快。 (2)用linq的join代替两层循环效率更高。 (3)用linq的where过滤。
谢谢你的回答,如果用linq的话,我是一定要把读取的文本转成datatable,然后再用linq来操作吧?[/quote] 不需要,Linq可以直接操作数组。[/quote] 哦,通过linq做关联操作比通过datatable做关联的效率要高是么?[/quote] 主要是join通过比较key的hash来关联,你自己也可以写出相同算法复杂度的程序(logN),但是双重循环肯定效率很低(N^2)[/quote] 用hash关联确实是比较理想的,您指的join函数是linq中的还是datatable中的呢?不好意思啊,c#方面我是菜鸟,问的问题可能比较低级,现在是两个数组,想实现一个left join效果,您推荐使用linq还是datatable呢? 能否给个例子啊高人,多谢这么晚了还回复我。
devmiao 2014-03-11
  • 打赏
  • 举报
回复
引用 5 楼 CJavaer 的回复:
[quote=引用 4 楼 devmiao 的回复:] [quote=引用 3 楼 CJavaer 的回复:] [quote=引用 1 楼 devmiao 的回复:] (1)File.ReadAllLines更快。 (2)用linq的join代替两层循环效率更高。 (3)用linq的where过滤。
谢谢你的回答,如果用linq的话,我是一定要把读取的文本转成datatable,然后再用linq来操作吧?[/quote] 不需要,Linq可以直接操作数组。[/quote] 哦,通过linq做关联操作比通过datatable做关联的效率要高是么?[/quote] 主要是join通过比较key的hash来关联,你自己也可以写出相同算法复杂度的程序(logN),但是双重循环肯定效率很低(N^2)
JS 2014-03-11
  • 打赏
  • 举报
回复
引用 4 楼 devmiao 的回复:
[quote=引用 3 楼 CJavaer 的回复:] [quote=引用 1 楼 devmiao 的回复:] (1)File.ReadAllLines更快。 (2)用linq的join代替两层循环效率更高。 (3)用linq的where过滤。
谢谢你的回答,如果用linq的话,我是一定要把读取的文本转成datatable,然后再用linq来操作吧?[/quote] 不需要,Linq可以直接操作数组。[/quote] 哦,通过linq做关联操作比通过datatable做关联的效率要高是么?
devmiao 2014-03-11
  • 打赏
  • 举报
回复
引用 3 楼 CJavaer 的回复:
[quote=引用 1 楼 devmiao 的回复:] (1)File.ReadAllLines更快。 (2)用linq的join代替两层循环效率更高。 (3)用linq的where过滤。
谢谢你的回答,如果用linq的话,我是一定要把读取的文本转成datatable,然后再用linq来操作吧?[/quote] 不需要,Linq可以直接操作数组。
JS 2014-03-11
  • 打赏
  • 举报
回复
测试关联的时候内存和cup镖的很快额
JS 2014-03-11
  • 打赏
  • 举报
回复
引用 13 楼 devmiao 的回复:
string[] result = arr1.Join(arr2, x => x.Split(',')[0], x => x.Split(',')[0], (x, y) => x + "," + y).ToArray();
大神出手果然一针见血啊,还有一个小小的请求,如果arr1左连接arr2的话,join用什么代替呢?最后一问哈
devmiao 2014-03-11
  • 打赏
  • 举报
回复
string[] result = arr1.Join(arr2, x => x.Split(',')[0], x => x.Split(',')[0], (x, y) => x + "," + y).ToArray();
devmiao 2014-03-11
  • 打赏
  • 举报
回复
var query = array1.Join(array2, x => x, x => x, (x, y) => new { x, y }); 在内部,Join方法会先将array1按照第一个Lambda选择的值将数据丢入HashTable,然后再将array2也丢入这个HashTable,最后再依次取出每个HashTable的条目,将array1和array2匹配的合并返回。
devmiao 2014-03-11
  • 打赏
  • 举报
回复
linq的join vaqr query = array1.Join(array2, x => x, x => x, (x, y) => new { x, y });
JS 2014-03-11
  • 打赏
  • 举报
回复
引用 10 楼 devmiao 的回复:
var query = array1.Join(array2, x => x, x => x, (x, y) => new { x, y }); 在内部,Join方法会先将array1按照第一个Lambda选择的值将数据丢入HashTable,然后再将array2也丢入这个HashTable,最后再依次取出每个HashTable的条目,将array1和array2匹配的合并返回。
大神,我找了很久没有找到linq关于操作关联数组的例子呢,都是操作数据表的,数据表有列名,但是数组没列名呢,能否麻烦您给写一下关联的代码呢,非常感谢呢,一定给你再加分 string[] arr1和string[] arr2两个数组 arr1的内容如:new string[] {"AAA,上海","BBB,北京",....} arr2的内容如:new string[] {"AAA,世贸","BBB,天坛",...} 是第一项进行关联,关联得出两个数组所有数据("AAA,上海,AAA,世贸","BBB,北京,BBB,天坛"...)
JS 2014-03-11
  • 打赏
  • 举报
回复
引用 10 楼 devmiao 的回复:
var query = array1.Join(array2, x => x, x => x, (x, y) => new { x, y }); 在内部,Join方法会先将array1按照第一个Lambda选择的值将数据丢入HashTable,然后再将array2也丢入这个HashTable,最后再依次取出每个HashTable的条目,将array1和array2匹配的合并返回。
谢谢你的耐心回答,我来测试一下。
JS 2014-03-10
  • 打赏
  • 举报
回复
引用 1 楼 devmiao 的回复:
(1)File.ReadAllLines更快。 (2)用linq的join代替两层循环效率更高。 (3)用linq的where过滤。
谢谢你的回答,如果用linq的话,我是一定要把读取的文本转成datatable,然后再用linq来操作吧?
bdmh 2014-03-09
  • 打赏
  • 举报
回复
读取后,做关联,可以用linq
加载更多回复(1)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧