C#读取大文本文件 C#如果读取一个大的文本文档,我的文本是一行一个手机号.如果是一万行.用平常的Reader去,得读几十秒呢!好慢.因为读取得添加到listbox中,还得判断是不是有重复的.重复的不添加.所以速度会有点慢.不知道那位有更好的办法.有这种方面的话.10万估计程序都得死了.有相应的代码更好.先谢谢大家了. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看一下你的代码,应该有大量的字符串累加操作导致的,用一下StringBuilder 先一次性全读取到StreamBuilder中,再把StringBuilder中内容进行处理并绑定 把问题分解一下:1.读取一行号码2.判断是否号码已存在3.否,则加入listbox4.如果是asp.net的应用,这时会Render为HTML返回我觉得如果只是读取得话,10000行要不了几十秒,所以你的问题应该不在Reader。要考虑:第2步,是如何处理的,是否有效率问题第4步,返回大量的数据是否有网络问题,IE对大量数据的Listbox的处理问题(我遇到过,换成FireFox就快多了) 我用C#内存映射的方法来读取,10万条才8秒就全部搞定了.不过判断重复这里消耗了大量的时间.不知道判断重复这里一条一条去判断真的很浪费时间. int rs = Regex.Matches(getnumber, sLine).Count; getnumber = getnumber.Replace(sLine+",", ""); getnumber = getnumber.Replace(sLine, ""); sLine = sLine + "(" + rs+")"; this.listBox1.Items.Add(sLine); getnumber是全部的号码. 通过这种正则表达式的方法得到号码的重复数.再把添加到LISTBOX中.这样的方法还耗了可多的时间.很郁闷.这样比循环LISTBOX中的值再一条一条的对比效率应该高可多了. 如果10万数据并判断重复能在20秒操作完我就满意了. 读取直接存放到SQL中然后再在SQL中进行删除重复的然后再读取SQL中的记录来使用 用SQL就更慢了.呵呵.读两次还不如一次读完. 1w行的listbox,谁用的话算是到了大霉 不应该放到StringBuilder用List<String>比较好,因为它除了速度快,还能解决重复问题, 而且能给后面处理带来方便 不要使用Regex,试试使用Dictionary<string,int>来保存.基本算法如下:Dictionary<string,int>d=new Dictionary<string,int>();循环读取行 if (d.ContainKey(号码)) d[号码]++; else d.Add(号码,0); string str = ""; IntPtr vFileHandle = CreateFile(path, GENERIC_READ | GENERIC_WRITE, FileShare.Read | FileShare.Write, IntPtr.Zero, FileMode.Open, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, IntPtr.Zero); if (INVALID_HANDLE_VALUE != (int)vFileHandle) { IntPtr vMappingHandle = CreateFileMapping( vFileHandle, IntPtr.Zero, PAGE_READWRITE, 0, 0, "~MappingTemp"); if (vMappingHandle != IntPtr.Zero) { IntPtr vHead = MapViewOfFile(vMappingHandle, FILE_MAP_COPY | FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, IntPtr.Zero); if (vHead != IntPtr.Zero) { uint vSize = GetFileSize(vFileHandle, IntPtr.Zero); byte[] temp = new byte[vSize]; for (int i = 0; i < vSize; i++) { byte vTemp = Marshal.ReadByte((IntPtr)((int)vHead + i)); temp[i] = vTemp; } ASCIIEncoding encoding = new ASCIIEncoding(); str = encoding.GetString(temp).Replace("\r\n", ","); UnmapViewOfFile(vHead); } CloseHandle(vMappingHandle); } CloseHandle(vFileHandle); } return str;转自爱心飞飞网:http://www.aixinff.com/htmls/2618.html 用hashtable来判断是否重复啊。就是手机号码,10万的话应该很快啊,我处理过IP地址库,40万条数据,每条数据都有大量文字表明这个IP属于哪个省哪个市,电信还是网通,等等,纯读取的话两秒就结束了。 .net调用双向ssl webservice 提示403 失败: Access Forbidden MVC3 前台 传值 后台 急! 中文乱码 --续问 限制访问的问题。 用母版页做的网页能用page_load事件嘛? ASP.NET AJAX 1.0 Beta 2安装后的问题 ASP.NET如何实现网摘功能,多谢[请看内容] [Crystal Report]安装补丁时,发生如下错误:fail to read/update registry... 大数据 Request接收中文,转换后乱码 并不包含对 的定义 gridview分页显示性能是否较差?
1.读取一行号码
2.判断是否号码已存在
3.否,则加入listbox
4.如果是asp.net的应用,这时会Render为HTML返回我觉得如果只是读取得话,10000行要不了几十秒,所以你的问题应该不在Reader。
要考虑:
第2步,是如何处理的,是否有效率问题
第4步,返回大量的数据是否有网络问题,IE对大量数据的Listbox的处理问题(我遇到过,换成FireFox就快多了)
int rs = Regex.Matches(getnumber, sLine).Count;
getnumber = getnumber.Replace(sLine+",", "");
getnumber = getnumber.Replace(sLine, "");
sLine = sLine + "(" + rs+")";
this.listBox1.Items.Add(sLine); getnumber是全部的号码. 通过这种正则表达式的方法得到号码的重复数.再把添加到LISTBOX中.这样的方法还耗了可多的时间.很郁闷.这样比循环LISTBOX中的值再一条一条的对比效率应该高可多了. 如果10万数据并判断重复能在20秒操作完我就满意了.
然后再在SQL中进行删除重复的
然后再读取SQL中的记录来使用
用List<String>比较好,因为它除了速度快,还能解决重复问题, 而且能给后面处理带来方便
基本算法如下:Dictionary<string,int>d=new Dictionary<string,int>();循环读取行
if (d.ContainKey(号码))
d[号码]++;
else
d.Add(号码,0);
IntPtr vFileHandle = CreateFile(path,
GENERIC_READ | GENERIC_WRITE, FileShare.Read | FileShare.Write,
IntPtr.Zero, FileMode.Open,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, IntPtr.Zero);
if (INVALID_HANDLE_VALUE != (int)vFileHandle)
{
IntPtr vMappingHandle = CreateFileMapping(
vFileHandle, IntPtr.Zero, PAGE_READWRITE, 0, 0, "~MappingTemp");
if (vMappingHandle != IntPtr.Zero)
{
IntPtr vHead = MapViewOfFile(vMappingHandle,
FILE_MAP_COPY | FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, IntPtr.Zero);
if (vHead != IntPtr.Zero)
{
uint vSize = GetFileSize(vFileHandle, IntPtr.Zero);
byte[] temp = new byte[vSize];
for (int i = 0; i < vSize; i++)
{
byte vTemp = Marshal.ReadByte((IntPtr)((int)vHead + i));
temp[i] = vTemp;
}
ASCIIEncoding encoding = new ASCIIEncoding();
str = encoding.GetString(temp).Replace("\r\n", ",");
UnmapViewOfFile(vHead);
}
CloseHandle(vMappingHandle);
}
CloseHandle(vFileHandle);
}
return str;
转自爱心飞飞网:http://www.aixinff.com/htmls/2618.html