将datatable中的数据写成txt文件的速度问题?? 50分 在线等!!

游陆 2008-01-10 11:37:28
将datatable中的数据写成txt文件的速度问题??
datatable中保存了大量的数据,大概90多万条。现在用下面的代码将其写成txt文件。发现速度其慢无比。看代码:
private void WriteTxt(DataTable tb)
{
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
StreamWriter sr;

if (File.Exists(saveFileDialog1.FileName)) //如果文件存在,则创建File.AppendText对象
{
sr = File.AppendText(saveFileDialog1.FileName);
}
else //如果文件不存在,则创建File.CreateText对象
{
sr = File.CreateText(saveFileDialog1.FileName);
}
foreach (DataRow dr in tb.Rows)
{
sr.WriteLine(dr[0].ToString() + "\t" + dr[1].ToString() + "\t" + dr[2].ToString() + "\t" + dr[3].ToString() + "\t" + dr[4].ToString() + "\t" + dr[5].ToString() + "\t" + dr[6].ToString() + "\t" + dr[7].ToString());
}
sr.Close();
}
}
请教高手应该怎么才能提高效率呢???
...全文
507 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
卧_槽 2008-01-14
  • 打赏
  • 举报
回复
30m的txt文件,很难打开,没什么意义
crazycalf 2008-01-14
  • 打赏
  • 举报
回复
大家好,这里是新疆的.net QQ群体,欢迎大家加入(50794700)
GhostAdai 2008-01-14
  • 打赏
  • 举报
回复
先mark,再做实验。
机器人 2008-01-14
  • 打赏
  • 举报
回复
那么应该考虑用数据库了。90W条数据放在文本里,文本不就是充当数据库的角色么?

说实话IO效率可没有数据库高,数据库有索引等优化手段。

赫赫,当然还得看工程成本了。
春天的气息 2008-01-13
  • 打赏
  • 举报
回复
楼主结题吧,都已很清楚了吧!
benbenkui 2008-01-13
  • 打赏
  • 举报
回复
不知道生成XML的能快多少,但我做过一个XML的50W条数据,可能是数据很简单,
我只用13秒。楼主的.NET是2.0还是1.X的,如果是1.X的话就会很慢。
菜鸟问个问题:用异步的话是否会有阻塞的问题?
游陆 2008-01-13
  • 打赏
  • 举报
回复
速度没有明显的改善·
机器人 2008-01-10
  • 打赏
  • 举报
回复
建议不要使用DataTable,使用DataReader吧,读一行数据就往文本文件里写一行
游陆 2008-01-10
  • 打赏
  • 举报
回复
在把上面的问题解释一下,程序生成90多万条记录保存在datatable里面,现在我想把这些记录保存成txt文件,上面的代码已经可以实现,只是现在的效率非常的低,90多万条数据用了大概5-8分钟的时间才保存好,其间cpu占用率一直是100% ,保存完成后就提示虚拟内存不足。我的机器物理内存1.5g 虚拟内存2g。

1楼的能不能具体说说怎么用异步io来实现,还有其他提高效率的方法吗?
游陆 2008-01-10
  • 打赏
  • 举报
回复
将近30m。
haiwangstar 2008-01-10
  • 打赏
  • 举报
回复
估算一下90万条保存成文本数据有多大?
使用异步I/O
hilarysong 2008-01-10
  • 打赏
  • 举报
回复
写一条 清空缓存一下!!!
hilarysong 2008-01-10
  • 打赏
  • 举报
回复
private void WriteTxt(DataTable tb)
{
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
StreamWriter sr;

if (File.Exists(saveFileDialog1.FileName)) //如果文件存在,则创建File.AppendText对象
{
sr = File.AppendText(saveFileDialog1.FileName);
}
else //如果文件不存在,则创建File.CreateText对象
{
sr = File.CreateText(saveFileDialog1.FileName);
}
foreach (DataRow dr in tb.Rows)
{
sr.WriteLine(dr[0].ToString() + "\t" + dr[1].ToString() + "\t" + dr[2].ToString() + "\t" + dr[3].ToString() + "\t" + dr[4].ToString() + "\t" + dr[5].ToString() + "\t" + dr[6].ToString() + "\t" + dr[7].ToString());
}
sr.Close();
}
}
试试在循环里加入sr.Flush();
foreach(DataRow dr in tb.Rows)
{
sr.WriteLine(dr[0].ToString()+ "\t" + dr[1].ToString()+"\t"+dr[2].ToString()+ "\t"+dr[3].ToString()+"\t"+dr[4].ToString()+ "\t" + dr[5].ToString()+\t"+dr[6].ToString() + "\t" + dr[7].ToString());
sr.Flush();
}
游陆 2008-01-10
  • 打赏
  • 举报
回复
谢谢lonelygames ,今天你一直在帮我看问题。明天在挂一天,不行就结贴。这样说吧,数据可以分页显示,但是保存的时候还是得把90w条数据全部保存起来呀,处理的时候也的把90w条数据用条件比较一遍,找出其中符合条件的,在交给下一个人来处理。其实就是一个筛选系统,刚开始可能有90w条记录,经过n次比较筛选以后剩下符合条件的也就没有多少条记录了。

现在就是刚开始数据量比较大的时候的速度的问题!!!
lonelygames 2008-01-10
  • 打赏
  • 举报
回复
4 测了一下,一下显示太多数据也是个瓶颈.
lonelygames 2008-01-10
  • 打赏
  • 举报
回复
可惜要下班了;老天,昨晚本人的电脑电源烧了,没电脑用了.
但我有个问题不明白:
1 "后面还要对生成的这些数据进行处理,留下满足条件的数据删掉不满足条件的数据,用分页的话还需要都这些数据在分页读出来。"
处理数据的问题和显示界面有关吗?
2 为何要导出数据.
我想的法子是:
1 用户界面,只显示他需要的数据,可先读10000条记录,只需1-2秒吧,如果想快一点也可让读出数据少一点给用户看,想多看一点就加个分页;
2 用户在查询界面的同时,数据在导出,分段可设成10000条或任何级别的导;在上班啊,因没有时间,我做了一个1000000的循环虚拟写数据.
我的数据表记录是5000000条
所以问题的瓶颈可能在第三条的解决.
3 另一个问题就是写txt文件占用的资源了.得测,我想法是如果只写一个文件估计占用系统的虚拟内存过大,可否再分文件写,这样更优化一点,且无论以后有多大都可以扩展,只要你的硬盘空间允许.对应上第二条的分段.
我想:这样应该是占用系统的资源是最小的了.要想全部测试通过,得等本人电脑好了再说吧.
下班了,要回家喝奶了.88楼主.
cannycsy 2008-01-10
  • 打赏
  • 举报
回复
GOOD

http://topic.csdn.net/u/20080110/17/aae61ba2-7b1d-4954-9620-8754ff8ae585.html
yilanwuyu123 2008-01-10
  • 打赏
  • 举报
回复
还是Mark!节点分好了。
王集鹄 2008-01-10
  • 打赏
  • 举报
回复
一些数据库本身就支持导出文本文件的查询
Access的SQL语句,供参考:
SELECT * INTO [text;hdr=no;database=c:\temp].Table1.txt from Table1
游陆 2008-01-10
  • 打赏
  • 举报
回复
问题是这样会导致生成更慢。看来只有试下用多线程来保存了。
加载更多回复(21)

110,533

社区成员

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

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

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